第六篇:走近ConcurrentHashMap(JDK1.8)

前言

前面我们学习了HashMap的数据结构,分析了其源码,第五篇:HashMap的源码分析
在本篇文章中与HashMap相同的部分就不在赘述,但是HashMap是线程不安全的容器,在多线程环境下会有线程完全问题,虽然也有线程安全容器Hashtable,但是其通过synchronized修饰方法,通过独占锁的方式锁定类对象,效率不高,所以Java 又提供了线程安全容器ConcurrentHashMap,与HashMap的底层的数据结构相同,ConcurrentHashMap也是采用的“散列表+链表+红黑树”,不过红黑树中存储的不是TreeNode,而是TreeBin。在JDK1.8中 ConcurrentHashMap 大量采用CAS算法,unsafe.compareAndSwapInt(this, valueOffset, expect, update); CAS(compareAndSwap)比较并交换,就是比较valueOffset位置上的值是否等于expect,如果等于的话则返回true,并更新值。(PS:在JDK1.7中采用的是分段锁的方式)。在扩容,设值的过程中大量采用CAS无锁不阻塞的方式支持并发操作,但是是不是就不需要加锁了呢?答案是否定的。

环境

本源码基于JDK1.8

源码分析

首先,我们来看看ConcurrentHashMap中三个重要的原子操作。这三个方法的作用分别的
1.获得在i位置上的Node节点
2.利用CAS算法设置i位置上的Node节点
3.设置节点位置的值,仅在上锁区被调用

ConcurrentHashMap定义的三个原子操作

猜你喜欢

转载自blog.csdn.net/u014534808/article/details/104113555