多线程学习-线程生命周期+锁机制

线程生命周期

创建 ---- 等待 ---- 执行(阻塞) ---- 死亡

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:处理死锁

posted @ 2020-06-30 22:43  Hstar。  阅读(142)  评论(0)    收藏  举报