1:简单描述
1.8版本的与之前版本的ConcurrentHashMap相比,设计理念有很大的调整,之前的版本,主要用到分段加锁,即segment+数组+链表的方式,1.8版本采用cas和锁,并且锁的粒度更细,针对桶进行加锁,结构是数组+链表+红黑树
2:常见问题
A:get是否需要加锁?为什么?
concurrentHashMap 内部定义了volatile 字段 tab,类型是Node,且node属性val 和next也都是volatile类型,因此保证了每次读取的时候都是从内存中读取到最新的值。
B:get的时候,如果正好遇到扩容,会怎么样?
其实通过源码我们知道get的逻辑非常简单,1:如果hash相等,且key相同,那么直接返回val ;2:如果hash小于0 ,那么可能是forwardNode或者treeBin,分别采用对应的find方法进行查找,其中forwardNode表示该节点已经被移动到nextTab中,所以扩容不影响get。3:如果hash大于0,那么通过链表遍历出对应的节点。
网友评论