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

本文深入探讨Java并发编程中的活性、性能及测试问题,重点讲解如何避免锁顺序死锁、协作对象死锁以及开发调用导致的死锁,并介绍了死锁的避免与诊断方法。此外,文章还涉及了饥饿、丢失信号和活锁等其他活跃性危险,并提供了相应的解决方案。

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

 

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 活锁

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

   

小结:

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

 

 

### 回答1: 《Java并发编程实战》是一本经典的Java并发编程指南,它深入解析了Java中线程、锁、并发集合、并发工具等关键概念和技术,并提供了各种实用的实战技巧和例子。 该书包含以下主要节:引言、线程安全性、对象的共享、对象的构造与发布、基础构建模块、任务执行、取消与关闭、线程池、同步器、构建自定义的同步工具、性能与可伸缩性、显式锁、构建锁的高级特性、原子变量与非阻塞同步、隐式的线程局部变量、构建自定义的同步器、构建一个框架。 这本书的特点是理论结合实践,通过大量的实例和案例演示了各种并发编程问题的解决方案,以及如何正确地使用Java提供的并发工具和类库。在阅读过程中,读者可以逐步了解并掌握线程安全、锁、线程池等核心概念,从而能够更好地应对多线程编程中的各种挑战。 该书的目标读者主要面向有一定Java编程基础的开发人员和架构师,但也适合初学者通过系统学习并发编程知识。无论是学习Java并发编程的基础知识,还是深入研究Java并发编程的高级特性和技术,这本书都是不可或缺的参考书籍之一。 总之,通过阅读《Java并发编程实战》,读者可以系统地学习和掌握Java并发编程的基础和高级知识,提升自己在多线程编程方面的能力,从而编写出更高效、更可靠、更安全的并发程序。 ### 回答2: 《Java并发编程实战》是一本非常经典的Java并发编程书籍,由Brian Goetz等人合著。这本书以清晰易懂的方式介绍了Java并发编程的概念、原理和实践技巧,对于Java开发者来说,是学习和掌握多线程编程不可或缺的参考资料。 这本书的目录包括: 第1:介绍并发编程 第2:线程安全性 第3:对象的共享 第4:对象的组合 第5:构建并发程序 第6:任务执行 第7:取消和关闭 第8:线程池 第9:构建自定义的同步工具类 第10避免活跃性危险 第11:性能与可伸缩性 第12:并发程序的测试 第13:隐式使用锁 第14:构建高性能并发程序 这本书通过实例、案例和代码来解释并发编程的概念和技巧。它涵盖了从基本概念到高级主题的内容,包括线程安全性、锁、对象共享、线程池、自定义同步工具类等。通过学习这本书,读者可以了解多线程编程的核心概念,学会如何避免并发问题,提高程序的性能和可伸缩性。 《Java并发编程实战》不仅适用于Java初学者,也适合有一定经验的开发人员。它提供了一系列实用的技巧和建议,帮助开发人员编写高质量、高效率的并发程序。无论是想学习并发编程的基本原理,还是深入研究Java并发库中的高级特性,这本书都是一个不可多得的学习资源。 ### 回答3: 《Java并发编程实战》是由美国计算机科学家Brian Goetz等人合著的一本经典的Java并发编程指南。本书全面介绍了Java并发编程的基本概念、原则、机制和设计模式,是学习和理解Java并发编程不可或缺的重要参考书。 本书的目录包括以下主要部分: 第1部分:基础知识 1. 引论:介绍了并发编程的基本概念、挑战和解决方案。 第2部分:结构化并发应用程序 2. 线程安全性:详细介绍了线程安全性的概念、实现原理和验证方法。 3. 对象的共享:讲述了在多线程环境下如何安全地共享对象。 4. 对象的组合:介绍了如何使用复合对象来提高并发应用程序的性能和可扩展性。 第3部分:构建并发应用程序 5. 基础构建模块:详细介绍了Java并发编程的基本构建模块,包括线程池、任务和执行者框架。 6. 任务执行:讲述了如何利用任务和执行者框架来实现并发任务的执行。 7. 取消与关闭:介绍了如何取消和关闭并发任务以及处理取消操作的相关问题。 8. 线程池的扩展:讲述了如何扩展Java线程池以满足特定需求。 第4部分:活跃性、性能和测试 9. 阻塞与响应性:详细介绍了如何解决并发编程中的阻塞和响应性问题。 10. 性能与可伸缩性:讲述了如何提高并发应用程序的性能和可伸缩性。 11. 显式锁:详细介绍了显式锁的使用和相关设计模式。 12. 构建自定义的同步工具:介绍了如何构建自定义的同步工具。 第5部分:构建更安全的并发应用程序 13. 基础模块:详细介绍了Java并发编程中的基础模块,包括原子变量、非阻塞同步机制等。 14. 高级主题:讲述了一些高级的并发编程主题,包括显式条件、原子类等。 15. 显式的通知:详细介绍了如何使用显式的通知机制来实现线程间的协作和通信。 《Java并发编程实战》通过系统、全面的内容和丰富的示例展示了如何正确地并发编程。无论是初学者还是有一定经验的开发人员,都可从中获得宝贵的知识和实战经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值