前言:
本文并不会对Java并发集合详细介绍,本文的目的在与大家需要意识到并发集合也是解决并发的措施之一
一、 ConcurrentHashMap
CAS + Synchronized 来保证并发更新的安全,底层采用数组+链表/红黑树的存储结构
concurrencyLevel:并行级别、并发数、Segment 数,怎么翻译不重要,理解它。默认是16,也就是说ConcurrentHashMap 有16 个Segments,所以理论上,这个时候,最多可以同时支持16 个线程并发写,只要它们的操作分别分布在不同的Segment 上。这个值可以在初始化的时候设置为其他值,但是一旦初始化以后,它是不可以扩容的。再具体到每个Segment 内部,其实每个Segment 很像之前介绍的HashMap,不过它要保证线程安全,所以处理起来要麻烦些。
Java8 对ConcurrentHashMap 进行了比较大的改动,Java8 也引入了红黑树。
对ConcurrentHashMap想深入了解,请阅https://www.jianshu.com/p/865c813f2726
二、ConcurrentLinkedQueue
- 基于链接节点的无边界的线程安全队列,采用FIFO原则对元素进行排序,内部采用CAS算法实现
- 不变性
在入队的最后一个元素的next为null
队列中所有未删除的节点的item都不能为null且都能从head节点遍历到
对于要删除的节点,不是直接将其设置为null,而是先将其item域设置为null(迭代器会跳过item为null的节点)
允许head和tail更新滞后。这是什么意思呢?意思就说是head、tail不总是指向第一个元素和最后一个元素(后面阐述)
- 精妙之处:利用CAS来完成数据操作,同时允许队列的不一致性,弱一致性表现淋漓尽致
对ConcurrentLinkedQueue想深入了解,请阅 https://www.jianshu.com/p/231caf90f30b
三、ConcurrentSkipListMap
- 第三种key-value数据结构:SkipList(跳表)
- SkipList
- 平衡二叉树结构
- Skip list让已排序的数据分布在多层链表中,以0-1随机数决定一个数据的向上攀升与否,通过“空间来换取时间”的一个算法,在每个节点中增加了向前的指针,在插入、删除、查找时可以忽略一些不可能涉及到的结点,从而提高了效率特性
- 特性:
由很多层结构组成,level是通过一定的概率随机产生的
每一层都是一个有序的链表,默认是升序,也可以根据创建映射时所提供的Comparator进行排序,具体取决于使用的构造方法
最底层(Level 1)的链表包含所有元素
如果一个元素出现在Level i 的链表中,则它在Level i 之下的链表也都会出
每个节点包含两个指针,一个指向同一链表中的下一个元素,一个指向下面一层的元素
对ConcurrentSkipListMap想深入了解,请阅 https://segmentfault.com/a/1190000016168566
四、ConcurrentSkipListSet
内部采用ConcurrentSkipListMap实现