更新时间:2021年03月18日 08时58分13秒 来源:黑马程序员
编写优质的并发代码是一件难度系数非常高的事儿。Java语言从第一个版本开始内置了对多线程的支持,这一点在当年是十分伟大的,可是在我们对并发编程有了更深入的了解和大量的实践后,实现并发编程就有了大量的方案和更好的选择。本文是对并发编程的一点总结和思考,同时也分享了Java 5未来的版本中如何编写并发代码的一点经验。Java程序员培训经常遇到的几个并发问题:
为什么需要并发
并发实际上是一种解耦合的策略,它帮助我们把干什么(目标)和何时做(时机)分离。这样做能够 显著改善应用程序的吞吐量(获得大量的CPU调度时间)和结构(程序有多个部分在协同工作)。做过Java Web开发的人都知道,Java Web中的Servlet程序在Servlet容器的支持下采用单实例多线程的工作模式,Servlet容器为你处理了并发问题。
误解和正解
常见的对并发编程的误解有以下这些:
并发总能改善性能(并发在CPU有很多空闲时间时能显著改善程序的性能,但当线程数量较多的时候,线程间频繁的调度切换反而会让系统的性能下降) -编写并发程序无需改动原有的设计(目的与时机的解耦通常会对系统结构产生巨大的影响) -在使用Web或EJB容器时不用关注并发问题(只有了解了容器在干什么,才能更好的使用容器)
下面的这些说法才是对并发客观的了解:
编写并发程序会在代码上增加额外的开销 -正确的并发是比较复杂的,即使对于非常容易的问题 -并发中的缺陷因为不易重现也不容易被发现 -并发通常需要对设计策略从本质上进行改动。
并发编程的原则和技巧
1、单一职责原则
分离并发相关代码和其他代码(并发相关代码有自己的开发、改动和调优生命周期)。
2、限制数据作用域
两个线程改动共享对象的同一字段时可能会相互干扰,造成不可预期的行为,解决方案之一是构造临界区,可是必须限制临界区的数量。
3、使用数据副本
数据副本是避免共享数据的好方法,复制出来的对象只是以只读的方式对待。Java 5的java.util.concurrent包中增加一个名为CopyOnWriteArrayList的类,它是List接口的子类型,所以你可以认为它是ArrayList的线程安全的版本,它使用了写时复制的方式创建数据副本进行操作来避免对共享数据并发访问而引发的问题。
4、线程应尽可能独立
让线程存在于自己的世界中,不与其他线程共享数据。有过Java Web开发经验的人都知道,Servlet就是以单实例多线程的方式工作,和每个请求相关的数据都是用Servlet子类的service方法(或者是doGet或doPost方法)的参数传入的。只要Servlet中的代码只使用局部变量,Servlet就不会造成同步问题。Spring MVC的控制器也是这么做的,从请求中获得的对象都是以方法的参数传入而不是作为类的成员,很显著Struts 2的做法就正好相反,因此Struts 2中作为控制器的Action类都是每个请求对应一个实例。
推荐了解热门学科
java培训 | Python人工智能 | Web前端培训 | PHP培训 |
区块链培训 | 影视制作培训 | C++培训 | 产品经理培训 |
UI设计培训 | 新媒体培训 | 产品经理培训 | Linux运维 |
大数据培训 | 智能机器人软件开发 |
Python入门教程完整版(懂中文就能学会) | 零起点打开Java世界的大门 |
C++| 匠心之作 从0到1入门学编程 | PHP|零基础入门开发者编程核心技术 |
Web前端入门教程_Web前端html+css+JavaScript | 软件测试入门到精通 |