.
三大并发类:Concurrent、CopyOnWrite、Blocking
Java并发包中的集合从线程安全实现方式而言可分为三类:Concurrent、CopyOnWrite、Blocking。
-
Concurrent 类的集合基于 lock-free 的方式实现。严格来说,它们是真正的并发。适合实现较高的吞吐量。
-
CopyOnWrite 类的集合顾名思义,会在该变集合的操作中拷贝原数据,并用新的内部集合对象替换原内部对象。
-
Blocking 类的集合则通过锁(ReentrantLock)实现。它们会提供 “等待性” 的方法。
Concurrent 的代价
虽然 Concurrent 类的集合没有 CopyOnWrite 那么重的修改开销,但也是有代价的:
-
Concurrent 集合的遍历一致性较弱。
在利用迭代器遍历时,如果容器发生修改,迭代器可以继续进行遍历,不会抛出 ConcurrentModificationException。
在 HashMap 中则会抛出此异常(也就是 fail-fast 机制)
-
因为是弱一致性,所以 size 等操作未必准确。
-
读取的性能也具有不确定性。
List
CopyOnWriteArrayList
CopyOnWrite 是指对该集合的任何修改操作都会:拷贝原数组,修改后替换原数组;以此达到线程安全的目的。
这种数据结构适合 读多写少 的场景。因为修改开销比较大。
可直接查看其 add() 方法了解实现原理: