java并发编程实践 5.2 并发容器

缘起

《java并发编程实践》 5.2节

分析

JDK5提供了并发容器来改进5.1小节介绍的同步容器,同步容器说白了就是为了让所有线程对容器的所有状态进行串行访问. 从而实现了线程安全,但是代价是削弱了并发性. 一旦多根线程同时竞争容器级别(collection-wide)的锁的时候,吞吐量就会骤降.

并发容器就是为了多线程并发访问而设计的.

例如

  1. 并发容器ConcurrentHashMap就是为了取代同步容器SynchronizedSortedMap而生的(新的ConcurrentMap接口加入了对常见的符合操作的支持,如putIfAbsent、替换、条件删除),
  2. 并发容器CopyOnWriteArrayList就是为了取代同步容器SynchronizedList而生的(在大多数操作是只读操作的时候就适合CopyOnWriteArrayList使用).
  3. JDK5 添加了Queue接口,JDK为其提供了传统的FIFO实现——ConcurrentLinkedQueue和非线程安全的PriorityQueue(优先队列).Queue的操作并不会阻塞——如果队列是空的,那么从队列中获取元素就立刻返回null. 尽管你可以使用List来模拟Queue的行为(事实上,LinkedList就实现了Queue接口),但是忽略掉List随机访问的需求,Queue并发性能就更好.
  4. JDK5在Queue的基础上,还提供了BlockingQueue接口(Queue的子接口), 这种接口的实现类在生产者/消费者模型中有用
  5. 正像ConcurrentHashMap是SynchronizedMap的并发版本一样,ConcurrentSkipListMap 是SynchronizedSortedMap(例如)的并发版本,ConcurrentSkipListSet是SynchronizedSortedSet的并发版本.

并发容器取代同步容器,这种做法能显著的提高程序的可伸缩性.

ps: 什么叫可伸缩性? 简单讲就是可以简单的通过堆机器来完成更大规模的任务