ConcurrentHashMap(八股笔记)

Posted 无恙_z

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ConcurrentHashMap(八股笔记)相关的知识,希望对你有一定的参考价值。

ConcurrentHashMap

1、ConcurrentHashMap的存储数据结构

在jdk1.8,ConcurrentHashMap 取消了 Segment 分段锁,采用 CAS 和 synchronized 来保证线程安全。数据结构跟 HashMap1.8 的结构类似,Node数组+链表/红黑二叉树。Node数组里存key,value,next字段,hash值(其中valuenext都用volatile修饰,保证并发的可见性)。

Java 8 在链表长度超过一定阈值(8)时将链表(寻址时间复杂度为 O(N))转换为红黑树(寻址时间复杂度为 O(log(N)))。

synchronized 只锁定Node或红黑二叉树的首节点,这样只要 hash 不冲突,就不会产生并发,效率又提升 N 倍。

2、ConcurrentHashMap的并发因子可以修改吗?

不可以,但 HashMap 的并发因子可以修改。

3、hash字段一般情况下必须>=0,为什么?

①为负值的话有其它意义,散列表在扩容时会触发一个数据迁移的过程,旧散列表迁移完后需要放一个标记点ForwordingNode,这个节点的hash值固定是 -1(即当hashMOVED -1时,则需要进行扩容);

②红黑树的情况,红黑树是由一个特殊的节点来代理 TreeBin 结构,它的hash值固定是 -2;

4、ConcurrentHashMap是怎么保证写数据是线程安全的?

ConcurrentHashMap 是采用synchronizedNode头节点来保证线程安全。如果这个Node里是空的,这时候就依赖 CAS 来保证线程安全(线程使用 CAS 操作向头结点里写数据,失败则自旋保证成功)。

5、hash寻址算法

知道了一个 key 的 hash 值,用这个 hash 值跟数组长度取模,就可以得到下标位置,实际在代码中,采用了与运算 ( 两个都是 1 ,结果为 1 ,否则为 0 )代替了取模运算。这个数组下标的计算方法是“ (n - 1) & hash”(n 代表数组长度)。与运算的效率比取余运算的效率高。

以上是关于ConcurrentHashMap(八股笔记)的主要内容,如果未能解决你的问题,请参考以下文章

HashTable和ConcurrentHashMap学习笔记

ConcurrentHashMap笔记

java并发编程的艺术,读书笔记第六章 concurrentHashMap以及并发容器的介绍

大三实习面试腾讯被问到ConcurrentHashMap,我拿这份笔记狂怼面试官...

前端八股文浏览器系列:浏览器渲染前端路由前端缓存(HTTP缓存)缓存存储(HTTP缓存存储本地存储)

ConcurrentHashmap核心源码分析