Java编程开发学习需要掌握许多知识点,并发编程是java学习的难点,也是实际应用中最常使用的。写出高质量的碧昂发代码并非简单的事。但如果我们对并发编程有更多的理解和实践,那么在并行编程中将会有更多更好的方案和选择。以下是对Java学习中有关并发编程的问题的总结。
为何需要并行。
并行实际上是一种解耦策略,它有助于我们区分目标和时间。这显著地改善了应用程序的吞吐量和结构。任何从事Javaweb开发工作的人都知道,在Servlet容器的支持下,JavaWeb中的Servlet程序会使用一个单实例多线程工作模式,Servlet容器为您处理并发问题。
误会与正解
有关并发编程的常见误解如下:
并行总可以提高性能(CPU空闲时间很长时,并行性可以显著提高一个程序的性能,但是如果线程数目很大,多线程之间频繁的调度切换会使系统性能下降)-编写并发程序不需要修改原始设计(目标和时间的分离通常会对系统结构造成重大影响)-不需要关注并发问题(只有知道容器在做什么,以便更好地利用容器)
这些陈述只是在客观上同时存在:
写并行程序会给你的代码增加额外的开销——正确的并发是非常复杂的,即使对于很简单的问题-并发中的缺陷由于不易重新生成而难以发现——并发常常要求对设计策略进行根本性的修改。
并行编程原理与技术。
单点责任原则,分离并发相关代码和其它代码(并发相关代码具有自身的开发、修改和调整生命周期)。
在限制数据范围内,当两个线程修改共享对象的相同字段时,可能会互相干扰,从而导致无法期望的行为,解决方法之一是构造一个临界区,但必须限制临界区的数目。
对于数据拷贝,数据拷贝是避免共享数据的好方法,只对复制出来的对象进行处理。将名为CopyOnWriteArrayList的类添加到Java5的java.util.concurrent包中,这是一个List接口的子类型,因此可以将其视为ArrayList的线程安全版本,该方法采用写时复制方法创建数据拷贝,以避免对共享数据并发访问所产生的问题。
线程应该尽可能独立。
允许线程在其自身的世界中,而不与其他线程共享数据。熟悉JavaWeb开发经验的人都知道,Servlet以单实例、多线程的方式工作,每一个请求相关的数据都被传递到一个Servlet子类的service方法(doGet或doPost方法)。Servlet中的代码仅使用本地变量,因此Servlet不会引起同步问题。SpringMVC的控制器也是这样做的,从请求中获取的对象都是通过一个方法的参数传递给类的成员,显然,Struts2做了与之相反的事情,所以在Struts2中,Action类作为控制器就是每个请求一个实例。
现在国内Java编程人员的收入还算高。随着企业的高速发展,企业对编程人员的需求日益增加,因此,要求每个Java实践者更需扎实地掌握所学的技能。学习更多关于Java课程的学习路线图。可参阅图灵Java课程。