JAVA并发实战 第五章 基础构建模块

时间:2022-11-04 22:24:48

  委托是创建线程安全类的一个最有效策略,只需让现有的线程安全类管理所有的状态即可。

5.1 同步容器类

  同步容器类包括Vector和Hashtable,这些同步的封装类是由Collections.synchronizedXxx等方法创建的。这些类实现线程安全的方式是:将它们的状态封装起来,并对每个共有方法都进行同步,使得每次只有一个线程能访问容器的状态。

5.1.1 同步容器类的问题

  同步容器类是线程安全的,但是某些情况下可能需要额外的客户端加锁来保护复合操作。

5.1.2 迭代器与ConcurrentModificationException

  如果不希望在迭代器件对容器加锁,一种替代方式是“克隆”容器,并在副本上进行迭代。由于副本被封闭在线程内,因此其他线程不会在迭代器件对其进行修改,这样就避免了抛出ConcurrentModificationException。

5.1.3 隐藏迭代器

5.2 并发容器

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

  通过并发容器来代替同步容器,可以极大地提高伸缩性并降低风险。

5.2.1 ConcurrentHashMap

  与HashMap一样,ConcurrentHashMap也是一个基于散列的Map,但它使用了一种完全不同的加锁策略来提供更高的并发性和伸缩性。  

5.2.2 额外的原子Map操作

  由于ConcurrentHashMap不能被加锁来执行独占访问,因此我们无法使用客户端加锁来创建新的原子操作。

5.2.3 CopyOnWriteArrayList

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