concurrentHashMap原理详解

java1.8无论怎么优化,hashmap仍然不是线程安全的。所以在并发多线程环境下,仍然需要使用同步手段,concurrenthashMap仍然是很好的选择。

相比于hashmap,concurrentHashmap使用了很多同步方式。
1、在初始化数组的时候,concurrentHashMap使用了cas无锁化机制来保证了线程安全,这是一种乐观锁模式。
在这里插入图片描述
如上图所示的initTable方法,其中该方法的细节就是如下内容:
在这里插入图片描述
该方法的U.compareAndSwapInt(this, SIZECTL, sc, -1)这一行代码就是无锁化的cas算法对table进行的初始化。

2、在put元素的时候,concurrentHashMap同样采用了cas无锁化机制,代码如下:
在这里插入图片描述
casTabAt这一行就是在当前hash桶没有元素的时候,将第一个元素放入桶内的代码,此代码依然使用了cas算法,无锁化机制解决同步问题。

3、在所在的hash桶中有元素的时候,那么就比较复杂了,需要遍历整条链表的元素,进行put,那么concurrenthashMap源码为了保证线程安全,就在这里形成了一个同步代码块,这就是大名鼎鼎的分段锁。
在这里插入图片描述
分段锁降低了锁的粒度,是一种经典的实现方式。

4、concurrentHashMap还有一点非常巧妙的处理方式,就是在实现数组扩容的时候,是不允许其他的线程put操作的,一旦有其他的线程想要进行put操作,那么就会被逮住,拿去做苦力,帮忙进行扩容数据迁移操作。如下代码:
在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章