Java平台类库包含了丰富的并发基础构建模块,例如线程安全的容器类以及各种用于协调多个相互协作的线程控制流的同步工具类(Synchronizer)。本章将介绍其中一些最有用的开发构建模块,特别是在Java5.0和Java6中引入的一些新模块,以及在使用这些模块来构造并发应用程序时的一些常用模式。

5.1 同步容器类

同步容器类包括VectorHashtable,二者都是早期JDK的一部分,此外还包括在JDK1.2中添加的一些功能相似的类,这些同步的封装器类是由Collections.synchronizedXxx等工厂方法创建的。这些类实现线程安全的方式是:将它们的状态封装起来,并对每个公有方法都进行同步,使得每次只有一个线程能访问容器的状态。

5.1.1 同步容器类的问题

  • 性能低下
  • 不允许迭代时修改,并发修改异常

5.2 并发容器

Java5.0提供了多种并发容器类来改进同步容器的性能。同步容器将所有对容器状态的访问都串行话,以实现他们的线程安全性。这种方法的代价是严重降低并发性,当多个线程竞争容器的锁时,吞吐量将严重减低。

另一方面,并发容器是针对多个线程并发访问设计的。在Java5.0中增加了ConcurrentHashMap,用来替代同步且基于散列的Map,以及CopyOnWriteArrayList,用于在遍历操作为主要操作的情况下代替同步的List。在新的ConcurrentMap接口中增加了对一些常见符合操作的支持,例如“若没有则添加”、替换以及有条件删除等。

正如ConcurrentHashMap用于替代基于散列的同步Map,Java6也引入了ConcurrentSkipListMap和ConcurrentSkipListSet,分别作为同步的SortedMap和SortedSet的并发替代品。

5.2.1 ConcurrentHashMap

5.2.2 额外的原子Map操作

5.2.3 CopyOnWriteArrayList

5.3 阻塞队列和生产消费者模式

5.4 阻塞方法与中断方法

5.5 同步工具类

5.5.1 闭锁

5.5.2 FutureTask

5.5.3 信号量

5.5.4 栅栏