湖南营销型网站建设 j磐石网络,网页实训总结及心得体会,浙江建设干部学校网站,wordpress自定义分类筛选1. 基本概念#xff1a;
程序#xff1a; 程序是一些保存在磁盘上的指令的有序集合#xff0c;是静态的。程序包括#xff1a;内存资源、IO资源、信号处理等。#xff08;如#xff1a;XX.exe#xff09;
进程#xff1a; 进程是程序执行的过程#xff0c;包括了动态…1. 基本概念
程序 程序是一些保存在磁盘上的指令的有序集合是静态的。程序包括内存资源、IO资源、信号处理等。如XX.exe
进程 进程是程序执行的过程包括了动态创建、调度和消亡的整个过程进程是程序资源管理的最小单位。(当XX.exe执行后就会创建进程)
线程 线程是操作操作系统能够进行运算调度的最小单位。线程被包含在进程之中是进程中的实际运作单位一个进程内可以包含多个线程线程是资源调度的最小单位。
协程/纤程 协程 Coroutines 是一种比线程更加轻量级的微线程。类比一个进程可以拥有多个线程一个线程也可以拥有多个协程因此协程又称微线程和纤程。
2. 线程的启动
public class theardTest {private static class T1 extends Thread{Overridepublic void run(){for (int i0;i10;i){try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(T1);}}}public static void main(String[] args) {new T1().run();// new T1().start();for (int i0;i10;i){try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Main);}}}
使用 new T1().run(); 执行结果
T1
Main
Main
Main
Main
Main
Main
Main
Main
Main
Main
结论使用 new T1().run(); 方式执行启动线程会先执行 T1 中的方法然后再执行主程序 Main方法。
使用 new T1().start(); 方式执行后
Main
T1
T1
Main
T1
Main
Main
T1
Main
T1
Main
结论使用 new T1().start(); T1 线程会和主线程抢占资源执行。
面试题启动实现线程的三种方式 1. 继承 Thread类 2. 实现Runnable类 3. 使用线程池。如 Executors.newCachedThreadPool(); 3. 线程的基本方法
// 当前线程睡眠1000毫秒
Thread.sleep(1000);// 当前线程回到等待队列重新竞争cpu资源
Thread.yield();// 当 T1线程执行完毕后才开始执行当前线程
T1.join();
注意T1.join() 方法 可以确保线程执行的顺序。
4. 线程状态
new 新建状态 ——start 进入线程 ——runnable 可执行状态 ——cpu选中 running 执行状态 ——blocked 等待状态 —— terminated 结束状态。
注一般我们不用stop是停止线程。而是使用 intertupted方法去判断当前线程是否已经中断去清除状态。
5. synchronized 锁
JVM规范里并没有说明synchronized必须要怎么实现它只要给一个对象加上锁才可以去执行锁里的代码锁的是对象不是代码。并且锁定的方法和非锁定的方法会同时执行这个要注意脏读问题。
并且 synchronized 是可以保证可见性、原子性、有序性的。而 volatile不保证原子性。
synchronized 包括 monitor enter 获取监视器锁、monitor exi 释放监视器锁这个重要JVM指令java中每个对象都关联着一个监视器当线程获取了某一对象的监视器锁再次获取时只增加对应的计数不在重新执行一次获取过程。
这就是 synchronized 的可重入锁比如m1方法加了 synchronized 在m1中调用m2m2方法也是加了synchronized锁的但是m1可以正常调用m2方法。
即一个同步方法可以调用另外一个同步方法一个线程已经拥有某个对象的锁调用其他方法时再次申请锁的时候仍然会得到该对象的锁只增加对应的计数这就是获得的锁是可重入的。
synchronized的锁升级
markword 记录这个线程ID(偏向锁)
如果线程争用:升级为 自旋锁轻量级锁
10次以后升级为重量级锁 - OS向操作系统申请锁
锁只能升不能降锁膨胀。执行时间短《加锁代码)线程数少用自旋执行时间长线程数多用系统锁
使用锁的注意事项
1. 程序在执行过程中如果出现异常默认情况锁会被释放所以在并发处理的过程中有异常要多加小心不然可能会发生不一致的情况。比如在一个web app处理过程中多个servlet线程共同访网同一个资源这时如果异常处理不合适在第一个线程中抛出异常其他线程就会进入同步代码区有可能会访问到异常产生时的数据。因此要非常小心前处理同步业务逻超中的异常.
2. synchronizedObject不能使用String常量、Integer、Long类型等基础数据类型。