ConcurrentHashMap

特点

  1. 并发安全集合,存在多线程访问的情况下使用的集合工具;另外这种也行【Collections.synchronizedMap();】,将非现场安全转为线程安全。
  2. CHM 中是支持并发扩容的,也就是说如果当前的数组需要进行扩容操作,可以由多个线程来共同负责。
  3. 扩容是 ConcurrentHashMap 的精华之一,扩容操作的核心在于数据的转移,在单线程环境下数据的转移很简单,无非就是把旧数组中的数据迁移到新的数组。但是这在多线程环境下,在扩容的时候其他线程也可能正在添加元素,这时又触发了扩容怎么办?可能大家想到的第一个解决方案是加互斥锁,把转移过程锁住,虽然是可行的解决方案,但是会带来较大的性能开销。因为互斥锁会导致所有访问临界区的线程陷入到阻塞状态,持有锁的线程耗时越长,其他竞争线程就会一直被阻塞,导致吞吐量较低。而且还可能导致死锁。而 ConcurrentHashMap 并没有直接加锁,而是采用 CAS 实现无锁的并发同步策略,最精华的部分是它可以利用多线程来进行协同扩容。简单来说,它把 Node 数组当作多个线程之间共享的任务队列,然后通过维护一个指针来划分每个线程锁负责的区间,每个线程通过区间逆向遍历来实现扩容,一个已经迁移完的bucket 会被替换为一个 ForwardingNode 节点,标记当前 bucket 已经被其他线程迁移完了。
  4. 分而治之,支持多线程同时协助操作,再合并每个线程操作的结果,从而得到最终结果。

常用类

CopyOnWriteArrayList

ArrayList -> CopyOnWriteArrayList,在数据量不大的情况下使用,可以得到很好的并发性

CopyOnWriteArraySet

HashSet -> CopyOnWriteArraySet

ConcurrentSkipListSet

TreeSet -> ConcurrentSkipListSet

ConcurrentSkipMap

TreeMap -> ConcurrentSkipListMap