`
zhouchaofei2010
  • 浏览: 1085058 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

java并发编程实战-第10章-避免活跃性危险

 
阅读更多

第三部分 活跃性、性能和测试

 

java并发编程实战-第10章-避免活跃性危险

 

10.1.1 锁顺序死锁

        GUI为什么设计成单线程的原因

10.1.2 动态的锁顺序死锁

       转账时,对于参数账户a和b,如果设计成a转移b时先设定先锁定a再锁定b,则b转给a时就会先锁定b

 

再锁定a,造成锁顺序死锁

       

       此时可以通过取a和b的hash值,来确定锁定顺序的规则,如果有主键的话,则直接通过主键来确定

 

锁定规则,而不用判断hash值是否相同的情况

       

10.1.3 在协作对象发生死锁

 

      如果在类A 的方法a1 中调用类B的方法b2, 在B中方法b2调用类A的方法a2 。如果方法都是同步的,

 

则会造成死锁。类A方法先获得类A对象的锁然后试图获得类B的锁,而此时类B的方法b2已经获得类B对象的

 

锁试图去获得类A对象的锁  

      

10.1.4  开发调用

 

        开发调用方法,在方法中用同步代码块, 更容易进行死锁分析。有时候会造成原子性的问题,但

 

许多情况下,是某个操作失去原子性是可以接受的。比如更新出租车位置以及通知出租车车队

        

        

        

10.1.5 资源死锁

      假如一个任需要连接两个资源池中D1,D2,任务a 和任务b 获取D1和D2 的顺序可能是相反的

      

      线程饥饿死锁,如果某些任务需要等待另外一些任务的结果

      

10.2 死锁的避免和诊断

     两阶段分析:1找出什么地方需要获得多个锁2对这些实例进行全局分析,确保获取锁的顺序一致

     

10.2.1 支持定时的锁

 

       Lock类中的tryLock 可以设定锁的时间(不过只有在两个锁的时间有效,如果嵌套很多锁的时候,

 

也无法释放)

       

       Lock后续学习,暂时不理解

       (后续学)

       

10.2.2 通过线程转储信息来分析死锁 

         Thread Dump

         (后续学)

         

10.3 其他活跃性危险

包括饥饿、丢失信号和活锁等(“丢失信号” 14.2.3节中介绍)

 

10.3.1 饥饿

最常见的资源cpu时钟周期,优先级使用不当,不造成

 

避免使用线程优先级,调整了优先级,将造成程序运行与平台相关。

 

10.3.2 糟糕的响应性

  后台cpu密集型任务会造成前端响应时间,这时候发挥线程优先级。降低其优先级

  不良的锁

10.3.3 活锁

   线程不断重复执行相同的操作,而且总是失败

   

小结:

设计时应该避免顺序死锁,最好的方法是程序中始终使用开发调用

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics