Fork me on GitHub

ConcurrentHashMap源码理解jdk8

对应于HashMap的支持并发的类ConcurrentHashMap,在jdk8之前的实现是通过分段加锁同步的思想,来保证并发时的可用性和线程安全性。在jdk8中,实现基本采用CAS loop无锁同步,并且不再采用分段的办法而是按bucket/bin来进行同步,只有在产生冲突时才使用了synchronized的进行加锁同步,其中所使用的加锁对象是ConcurrentHashMap.NodeConcurrentHashMap底层存储的数据结构)。

ConcurrentHashMap的put操作

首先第一次调用put会调用initTable方法,用于初始化底层的存储数组,执行完后继续循环进行插入,插入前需要判断当前数据的key的位置是否是第一次插入,如果是则进行插入,插入的操作过程采用CAS操作保证原子性,插入完成跳出循环后需要对当前的键值对大小进行加1操作,这个操作也是采用CAS保证原子性,其中加1的过程中会判断是否需要扩容。如果当前插入位置已经有了其他数据,这就要进入synchronized包裹的代码,其中同步代码块中会判断当前的位置采用链表还是红黑树的结构来保存冲突的数据。


最新评论

    还没有人评论...

当当

友情链接

Powered by Python. Copyright © 2017.

鄂ICP备17010875号. All rights reserved.