多线程学习-线程生命周期+锁机制
线程生命周期
创建 ---- 等待 ---- 执行(阻塞) ---- 死亡
1:线程创建:jvm分配内存,初始化成员变量等
2:等待:线程调用start方法开启线程,jvm创建方法栈,程序计数器等,等待可用的资源随时执行
3:执行:线程运行
4:阻塞:1当开启线程后没有可用CPU,2调用sleep放弃CPU,3调用阻塞式io,等待返回值,4等待notify,5等待获取同步锁
5:死亡:正常结束或异常结束
线程安全问题
出现原因:当多个线程同时操作一个对象。
解决办法:
1:synchronized关键字
1)new一个对象当成锁,synchronized( 对象 ){ 代码块 } (作用范围:操作同一个对象的这一部分代码安全)
2)synchronized( this ){ 代码块 } (和1方法作用一样)
3)synchronized( 类.class){ 代码块 } (作用范围:不管new多少个对象操作,都安全)
4)给对象或成员变量加static一起使用(和3一样)
2:lock同步锁
创建Lock对象(lock,unlock)
ReentranLock();
参数:true:公平锁 -- 平均分配使用时间
false:非公平锁 --- 谁抢到就是谁的,不主动放开别的永远用不了
区别
1:synchronize是jvm层面,lock代码层面
2:synchronize不可监控,进入和释放是代码执行完jvm自动释放,lock是用unlock方法手动释放
3:synchronize线程没有资源会进入阻塞状态一直等待,lock没有抢到资源会自动结束线程
4:synchronize只能是非公平锁,lock可选公平非公平
死锁
多个线程互相等待对方的资源,所造成的僵局,导致进程无法进行。
死锁产生的必要条件
1:互斥条件 ---- 同一资源同时只能一个线程使用,其他没有获得的资源则进入等待
2:不可剥夺条件 ----- 抢到资源的线程除非主动释放,不然不可被其他线程抢到资源
3:请求与保持条件 ----- 同一线程再已获得一个资源的情况下,再去请求其他资源,而新的资源被其他线程拥有,线程只能进入等待,且不放弃自己所拥有的资源
4:循环等待条件 ----- 在一系列进程(abc),已有资源(123),a拥有1,需要请求2,b拥有2,需求请求3,c拥有,3,需要请求1,所造成的循环等待。
死锁处理
1:死锁预防 -- 在代码编写中破幻产生死锁的四种条件以达到预防作用
1)破坏互斥:资源互斥条件不可破坏,同一资源只能一个线程使用,否则发生线程安全
2)破坏占用并等待:在已有资源的情况下,请求新的资源,但是新的资源被占用,线程只能在等待状态,破坏此条件则当前条件,多个资源一起获得或请求新资源前先释放原有资源
3)破坏不可抢占:运行资源抢夺
4)破坏循环等待:对每个资源进行升序排列,按顺序获取并释放
2:死锁避免
1)有序分配法:为所有资源排序编号,同类资源一次申请,不同资源按顺序申请
2)银行家算法:判断线程所需要的资源请求资源是否匹配,否则等待,判断请求资源和剩余资源是否足够,否则等待,尝试分配,减去他所请求的资源之后检测已占用资源和空闲资源是否正常,否则恢复尝试分配的值,继续等待,正常则正式分配执行程序
3)顺序加锁:多个线程按顺序加锁,其他线程按顺序接受使用
4)限时加锁:ab线程,12资源,互相占用,请求新资源被拒绝时则等待,设置不同的等待时间,超时释放资源,双方会由不同的使用时间。
3:检测死锁
4:处理死锁

浙公网安备 33010602011771号