ConcurrentHashMap源码走读
目录 ConcurrentHashMap源码走读 简介 放入数据 容器元素总数更新 容器扩容 协助扩容 遍历 ConcurrentHashMap源码走读 简介 在从JDK8开始,为了提高并发度, ConcurrentHashMap 的源码进行了很大的调整。在JDK7中,采用的是分段锁的思路。简单的说,就是 ConcurrentHashMap 是由多个 HashMap 构成。当需要进行写入操作的时候,会寻找到对应的 HashMap ,使用 synchronized 对对应的 hashmap 加锁,然后执行写入操作。显然,并发程度就取决于 HashMap 个数的多少。而在JDK8中换了一种完全不同的思路。 首先,仍然是使用 Entry[] 作为数据的基本存储。但是锁的粒度被缩小到了数组中的每一个槽位上,数据读取的可见性依靠 volatile 来保证。而在尝试写入的时候,会将对应的槽位上的元素作为加锁对象,使用 synchronized 进行加锁,来保证并发写入的安全性。 除此之外,如果多个Key的 hashcode 在取模后落在了相同的槽位上,在一定数量内(默认是8),采用链表的方式连接节点;超过之后,为了提高查询效率,会将槽位上的节点转为使用红黑树结构进行存储。 还有一个比较大的改变在于当进行扩容的时候,除了扩容线程本身,如果其他线程识别到了扩容进行中,则会尝试协助扩容。