ConcurrentHashMap(八股笔记)
Posted offerNotFound
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ConcurrentHashMap(八股笔记)相关的知识,希望对你有一定的参考价值。
ConcurrentHashMap
1、ConcurrentHashMap的存储数据结构
在jdk1.8,ConcurrentHashMap 取消了 Segment 分段锁,采用 CAS 和 synchronized 来保证线程安全。数据结构跟 HashMap1.8 的结构类似,Node数组+链表/红黑二叉树。Node数组里存key
,value
,next字段
,hash值
(其中value
和next
都用volatile修饰,保证并发的可见性)。
Java 8 在链表长度超过一定阈值(8)时将链表(寻址时间复杂度为 O(N))转换为红黑树(寻址时间复杂度为 O(log(N)))。
synchronized
只锁定Node
或红黑二叉树的首节点,这样只要 hash 不冲突,就不会产生并发,效率又提升 N 倍。
2、ConcurrentHashMap的并发因子可以修改吗?
不可以,但 HashMap 的并发因子可以修改。
3、hash字段一般情况下必须>=0,为什么?
①为负值的话有其它意义,散列表在扩容时会触发一个数据迁移的过程,旧散列表迁移完后需要放一个标记点ForwordingNode
,这个节点的hash值固定是 -1(即当hash
MOVED
-1时,则需要进行扩容);
②红黑树的情况,红黑树是由一个特殊的节点来代理 TreeBin 结构,它的hash值固定是 -2;
4、ConcurrentHashMap是怎么保证写数据是线程安全的?
ConcurrentHashMap 是采用synchronized
锁Node
头节点来保证线程安全。如果这个Node
里是空的,这时候就依赖 CAS 来保证线程安全(线程使用 CAS 操作向头结点里写数据,失败则自旋保证成功)。
5、hash寻址算法
知道了一个 key 的 hash 值,用这个 hash 值跟数组长度取模,就可以得到下标位置,实际在代码中,采用了与运算 ( 两个都是 1 ,结果为 1 ,否则为 0 )代替了取模运算。这个数组下标的计算方法是“ (n - 1) & hash”(n 代表数组长度)。与运算的效率比取余运算的效率高。
以上是关于ConcurrentHashMap(八股笔记)的主要内容,如果未能解决你的问题,请参考以下文章
HashTable和ConcurrentHashMap学习笔记
java并发编程的艺术,读书笔记第六章 concurrentHashMap以及并发容器的介绍