-
(1) 并发容器≠同步容器
(2) 同步容器将所有对容器状态的访问都串行化,严重影响性能
(3) 并发容器专门为多线程并发设计, 应该尽可能通过并发容器代替同步容器
(4) 并发容器有 ConcurrentHashMap, CopyOnWriteArrayList, ConcurrentLinkedQueue, ConcurrentSkipListSet等
-
ConcurrentHashMap
(1) 同步容器在执行每个操作期间持有同一个锁, 而ConcurrentHashMap采取的加锁机制是粒度更细的分段锁(后面会讲)
(2) 在迭代的过程中, 并发容器不会抛出ConcurrentModificationException异常, 因此不需要在迭代过程中对容器加锁
这也导致了一个问题就是调用并发容器的size()方法时, 返回的值是一个近似值
(3) 一些常见的复合操作已经在ConcurrentHashMap中实现, 例如"若没有则添加"、"若相等则移除"等, 所以在决定自己实现之前要先查docs
(4) ConcurrentHashMap没有实现对自身加锁以提供独占访问, 它提供的是各个方法上的细粒度加锁
(5) 因此, 和Hashtable, synchronizedMap相比, 在大多数情况下应该使用ConcurrentHashMap; 只有需要加锁独占Map对象时, 才放弃使用ConcurrentHashMap
-
CopyOnWriteArrayList
(1) 使用CopyOnWriteArrayList时, 迭代期间不需要对容器加锁或复制
(2) 实现机制是: 每次修改时都会创建并发布一个新的容器副本, 而容器的迭代器总是保留一个指向底层基础数组的引用, 这个数组不会被修改且可见
(3) 由于修改就会造成CopyOnWriteArrayList的底层数组的复制, 因此当迭代操作远多于修改操作时, 才应该使用CopyOnWriteArrayList
网友评论