并发集合源码系列(九):并发集合总结

Posted by 陈树义 on 2021-06-17

让我们用过思维导图总结一下 JDK 中所有的并发集合。

在 JDK 的并发集合包中,一共有如下 7 个类:

  • ConcurrentHashMap:高并发的HashMap
  • ConcurrentSkipListMap:高并发下的TreeMap(基于跳表实现)
  • ConcurrentSkipListSet:内部使用ConcurrentSkipListMap实现
  • CopyOnWriteArrayList:高并发的ArrayList,适合读场景。
  • CopyOnWriteArraySet:高并发的Set集合,使用CopyOnWriteArrayList实现。
  • ConcurrentLinkedQueue:高并发的链表队列。
  • ConcurrentLinkedDeque:高并发的双向链表队列。

上面 7 个类其实可以分为 4 类:

高并发的HashMap

ConcurrentHashMap 是高并发的 HashMap 实现,其采用数组 + CAS 的方式实现并发控制。比起 JDK 1.7 (数组+segment+锁)的方式有更好的性能,在并发不是特别高的场景下会有更好的效率

高并发的TreeMap

我们普通的 HashMap 是无序的,而 TreeMap 则是 Map 的有序实现。但这两者都不是线程安全的,虽然我们可以通过自己加锁实现线程安全,但很多情况下效率都比较低。于是有了 ConcurrentSkipListMap 的诞生。

ConcurrentSkipListMap 是一个适用于高并发场景下的跳表实现,其实一个有序的 Map 实现,能够实现 log(N) 时间复杂度的查询、插入、删除操作。而 ConcurrentSkipListSet 则是采用 ConcurrentSkipListMap 实现的高并发有序 Set 集合。

高并发的ArrayList

CopyOnWriteArrayList 是高并发下的 ArrayList,其能够实现较高并发的数据读取,适用于读场景频繁的情况。而 ConcurrentSkipListSet 则是使用 CopyOnWriteArrayList 实现的 Set 集合,适用于高并发的数据读场景。

高并发的队列

ConcurrentLinkedQueue 是高并发情况下实现的链表队列,而 ConcurrentLinkedDeque 是高并发情况下实现的双向链表队列。