Java并发编程实战笔记 (三)活跃性问题——死锁、饥饿、活锁

一、死锁

        两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。

死锁的几种类型:

        1.锁顺序死锁

                原因:两个线程试图以不同的顺序来获得相同的锁;

          如果所有线程以固定的顺序来获得锁,那么在程序中就不会出现锁顺序死锁

        2. 协作的对象间相互调用发生的死锁 

        3. 资源型死锁

1.死锁产生条件

  1. 互斥条件:该资源任意一个时刻只由一个线程占用。
  2. 请求与保持条件:一个线程因请求资源而阻塞时,对已获得的资源保持不放。
  3. 不剥夺条件:线程已获得的资源在未使用完之前不能被其他线程强行剥夺,只有自己使用完毕后才释放资源。
  4. 循环等待条件:若干线程之间形成一种头尾相接的循环等待资源关系。

2. 死锁的避免和预防

  1. 破坏请求与保持条件 :一次性申请所有的资源。
  2. 破坏不剥夺条件 :占用部分资源的线程进一步申请其他资源时,如果申请不到,可以主动释放它占有的资源。
  3. 破坏循环等待条件 :靠按序申请资源来预防。按某一顺序申请资源,释放资源则反序释放。破坏循环等待条件。      

二、饥饿

        是指线程由于无法访问到它所需要的资源而不能继续执行。

        常见原因:

        1. cpu时钟周期

        2. 使用了Thread 接口中定义的优先级。

        要避免使用线程优先级,因为这会增加平台依赖性,并可能导致活跃性问题

        

三、活锁

        是指线程既不阻塞、也不继续执行、不断地重复执行相同操作。

        例如:线程处理事务,事务失败,消息处理机制回滚整个事务,并重新开始执行。

        当多个相互协作的线程都对彼此进行相应从而修改各自的状态,并使得任何一个线程都无法继续执行时,就发生了活锁。

        解决办法:引入随机性。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值