1.8版本ConcurrentHashMap 相关问题

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,那么通过链表遍历出对应的节点。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容