首页 > 代码库 > java 线程 (一): 并发简介

java 线程 (一): 并发简介

这两天在读<java并发编程实战>,好久没写东西了,准备开始除草。^_^

并发编程由来:
     早年的计算机中没有操作系统,在某个时间段内只支持运行一个程序,并且这个程序能访问计算机的所有资源。在这个程序完全执行完后,再执行下一个程序。

    引入并发编程的好处:
  • 高效性:计算机的各个部件不用忙等,例如一个程序在使用IO的时候,CPU可以给另外一个程序使用。这样便提高了设备的使用率。
  • 公平性:计算机上运行的程序应该一视同仁,而不是某一个先执行完后,再让另外一个程序开始执行。
  • 便利性:在计算多个任务时,应该编写多个程序,必要时,让其互相通信,这比让一个程序来实现多个任务要更容易实现。
     并发编程最早的体现是多进程的并发编程,这是由操作系统的出现而引入的。
     其上的好处也同样促使着线程的出现,线程允许一个进程中有多个程序控制流。随着摩尔定律的实现重任逐渐由单cpu的性能增加转移到cpu数量的增加,怎么提高多cpu的资源利用率变得非常重要。这些原因促使线程的并发编程越发重要。

多线程编程的优势:
  • 发挥多处理器的强大能力:单线程程序只能某刻跑在一个cpu上,而多线程程序某刻可以跑在多个cpu上,这里效率的提升毋庸置疑。那假若只有一个cpu呢?只有一个cpu,在某些情景下多线程程序的表现依旧比单线程程序要好,例如该进程的一个线程正在等待IO设备的释放,而该进程的另外线程可以使用其他设备,倘若只有一个线程,那么就只好等着了。 - -
  • 建模的简单性:通过使用线程,可以将复杂并且异步的工作流进一步分解为一组简单并且同步的工作流,每个工作流在一个单独的线程中运行,并在特定的同步位置进行交互。这一条实际影响了多线程技术的使用场景,即通常将逻辑上独立的任务用多线程技术来实现。

线程带来的风险:
  • 安全性问题:在大多情况下,线程间并不是完全独立的,而是相互协作去共同完成一个task,因此可能需要共同的去访问一个资源,当多个线程同时访问和修改一个变量时便容易出现这类问题,这就是在串行编程模型中引入了非串行因素,这类问题称为线程的竞速状态。
  • 活跃性问题:有时往往需要控制多个线程的执行顺序,例如一个线程去读IO,另一个线程从上一个线程中取,因此我们需要将线程进行同步的控制。线程间的协作,容易导致死锁、饥饿等问题。由此线程就会变得不"活跃"。
  • 性能问题:频繁的线程切换、同步机制(经常抑制编译器优化,使内存缓存区的数据无效)。在这里提出一个问题:线程是可以执行一些复合操作的,在使用方式上与进程差异不大,为什么我们不在线程的基础上进一步的细分,比如搞出一个比线程更细的调度单位"小线程",这样的话程序的执行效率不会更高吗?答:这样会进一步增加程序控制流的数量,会导致更加频繁的线程切换,其实划分到线程这一层或许就是最好的折中了吧。^-^

无所不在的线程:
     在我们自己写的程序中,通常要注意线程安全的地方:
  • Timer:我们自己写的定时任务,Timer管理的线程会调用。而其他线程也很有可能,因此,在这要注意线程安全。
  • Servlet和JSP:通常我们的Servlet和JSP会被多个线程同时所调用,web服务器会为每一个到来的http请求都从线程池中分配一个线程给它。因此在Servlet和JSP中我们需要保证线程安全,同理,在ServletContext和HttpSession等容器中保存的Servlet过滤器和对象,都必须是线程安全的。
  • 远程方法调用(RMI):在RMI中,存在被多个线程重入的可能,所以必须确保它们自身的线程安全性

java 线程 (一): 并发简介