《Java并发》:第一节 并发的意义

来源:互联网 发布:大麦盒子官方软件 编辑:程序博客网 时间:2024/04/20 08:47

1、更快的执行

多处理器机器:将程序划分为多个片段,在单独的处理器上运行每个片段,从而可以极大的提高吞吐量。学会如何利用这些额外的处理器,正是并发赋予你的能力。

单处理器机器:

a.在多处理器机器上将程序划分为多个片段可以更快的执行,是很好理解。但是在单处理器机器上,就让人很迷惑了。程序A拆分成两个并发的子程序B和子程序C,你想的可能是让B和C能够同时运行,能够提高运行速度。但是在单处理器机器上,同一时刻永远只有一个任务在运行,处理器只是在B和C之间切换而已,这还增加了上下文切换的代价(从一个任务切换到另外一个任务)。因此我们有理由认为,在单处理器机器上,将程序A顺序执行要比将程序A拆分为并发的子程序B和子程序C要更快一些,因为可以节省上下文切换的代价。

b.上述的理解是片面的,使这个问题变得有些不同的是阻塞。如果程序中的某个任务因为该程序控制范围之外的某些条件(通常是I/O)而导致不能继续执行,我们就说这个任务或线程阻塞了。如果没有并发整个程序都会停下来,直至外部条件发生变化。但是,如果使用并发来编写程序,那么当一个任务阻塞,程序中其他的任务还可以继续执行,因此这个程序可以保持继续向前执行。假设有个程序A,它从硬盘读取一个文件并对文件进行处理,它重复这样的操作直至完成许多文件的处理。在读取文件时可能会发生I/O阻塞,这个时候整个程序都停了下来;但是如果我们把程序A拆分成两个并发的子程序B(负责读取文件)和子程序C(负责处理文件),那么当子程序B发生阻塞的时候,子程序C可以继续处理文件,从而提高了执行速度和吞吐量。

c.总结:在单处理器机器上,如果没有任务会阻塞,从性能角度看,使用并发就没有任何的意义(此处仅考虑性能)。

2、创建可响应的用户界面

最常见的示例是事件驱动编程。使用并发最吸引人的一个原因就是可以产生一个可响应的用户界面。通过创建单独的执行线程来响应用户的输入,即使这个线程在大多数时间里都是阻塞的,但是程序可以保证具有一定程度的可响应性。

3、改进代码的设计(仿真)

在单处理器机器上使用多任务的程序,在任意时刻仍旧只在执行一项工作,因此从理论上讲,肯定可以不用任何任务而编写出相同的程序。但是,并发提供了一个重要的组织结构上的好处,你的程序设计可以大大的简化。某些类型的问题,例如仿真,没有并发的支持是很难解决。例如我们要仿真一个酒店厨师、服务员和顾客之间的关系,如果不使用并发实在很难解决,而且并发更符合现实场景。

0 0
原创粉丝点击