天天看点

Java并发编程实践笔记之—并发容器(Concurrent Collections)

什么是并发容器

  • Java5.0提供
  • 针对多个线程并发访问设计的
  • 改进同步容器的性能(同步容器将所有对容器状态的访问都串行化来实现线程安全,代价就是严重降低并发性)

Queue

  • 用来保存一组待处理的元素
  • 几种实现:ConcurrentLinkedQueue, PriorityQueue, BlockingQueue(可阻塞,用在生产者-消费者模式中)
  • Queue和List的关系:虽然可以用List来模拟Queue的行为(事实上正是通过LinkedList来实现Queue的),但还需要一个Queue类,因为它能去掉List的随机访问需求从而实现更搞笑的并发

ConcurrentHashMap

  • 代替HashMap
  • 回顾:同步容器HashMap的实现方式是:将每个方法都在同一个锁上同步并使得每次只能有一个线程访问容器
  • ConcurrentHashMap使用粒度更细的加锁机制来实现更大程度的共享——分段锁
    1. 任意数量的读取线程可以并发访问Map
    2. 执行读取操作的线程和执行写入操作的线程可以并发访问Map
    3. 一定数量的写入线程可以并发修改Map
  • ConcurrentHashMap的权衡:size和isEmpty这样的方法只是一个估计值,被换取了更重要的性能优化,包括get,put,containsKey,remove等
  • ConcurrentHashMap代替Map进一步提高代码的可伸缩性。只有当应用程序需要加锁Map进行独占访问时,才应该放弃用ConcurrentHashMap
  • ConcurrentMap接口:定义了原子“复合”操作(If-No-Add, Remove-If-Equal, Replace-If-Equal)

CopyOnWriteArrayList/Set

  • 代替同步的List/Set
  • Copy-On-Write指写入时复制,其安全型在于,只要正确地发布一个事实不变对象,在访问对象时就不再需要进一步的同步。在每次修改时,都会创建并重新发布一个新的容器副本
  • 因为每次修改容器都会复制底层数组,需要一定开销,特别是当容器的规模较大的时候。所以仅当迭代操作远远多于修改操作的时候,才应该使用Copy-On-Write容器