并发是一种解耦策略,它帮我们把做什么(目的)和何时做(时机)分开。解耦的目的和时机能明显改进应用程序的吞吐量和结构。
并发的迷思与误解:
1).并发总能改进性能:并发有时能改进性能,但只在多个线程或多个处理器之间能分享大量等待时间的时候管用。
2).编写并发程序无需修改设计:并发设计的算法和单线程系统设计极为不同,目的与时机的解耦往往对系统结构产生巨大影响。
3).在采用WEB或EJB容器时,理解并发问题并不重要:实际上,了解容器在做什么有利于自身程序的设计及改善。
1.并发防御原则:
1).单一权责:并发相关代码有自己的开发、修改和声明调优。建议分离并发相关代码和其他代码。
2).限制数据作用域:更新共享数据的地方越多,越可能出现以下问题:a.破坏了修改共享数据的代码;b.花更多精力保证其他地方不受影响;c.很难找到错误源。建议谨记数据封装,严格限制对可能被修改的数据的访问。
3).使用数据副本
4).线程应尽可能独立:每个线程都在自己的世界中,不与其他线程共享数据。
2.并发执行模型:1).生产者---消费者模型;2).阅读---作者模型;3).宴席哲学家模型
3.警惕同步方法之间的依赖:避免使用同一个共享对象的多个方法。必要时可以使用一下三种方法:
1).基于客户端的锁定:客户端代码在调用第一个方法前锁定服务端,确保锁的范围覆盖了调用最后一个方法的代码。
2).基于服务端的锁定:在服务端创建锁定服务端的方法,调用所有方法,然后解锁。让客户端调用新方法。
3).适配服务端:创建执行锁定的中间层。这是一种基于服务端的锁定的新例子,不必修改原服务端代码。
4.尽肯能减少同步区域。
5.不要同时追踪非线程缺陷和线程缺陷,确保代码在线程外可工作。