ConcurrentHashMap是线程安全的HashMap,这个应该大家都知道,我就不多废话了,实现的思想是使用的分段加锁,使用分段加锁的作用当然就是可以有效提升并发量,可以对比一下所有操作都加锁的HashTable,就能明白分段加锁的好处了
既然说是分段加锁,那么我们可以猜想一下是根据什么依据来进行分段的呢?
我们都知道HashMap的底层是一个数组,当里面的键值对出现了hash冲突的话,就会挂载成为一个链表,链表的阈值达到了8之后就会转化为红黑树,既然底层的数据结构是数组的话,那么是否可以对数组来进行加锁呢?我们拿ConcurrentHashMap的put方法来分析一下其中的源码实现就知道了
// ConcurrentHashMap的put方法直接就是调用的类中的putVal方法,所以我这里就直接贴出来putVal方法了
final V putVal(K key, V value, boolean onlyIfAbsent) {
// key和value都不允许为null,否则会报错
if (key == null || value == null) throw new NullPointerException();
// 计算hash值
int hash = spread(key.hashCode());
// 当前链表中元素的个数
int binCount = 0;
// table就是底层的数组
for (Node<K,V>[] tab = table;;) {
Node<K,V> f; int n, i, fh;
// 判断数组是否为空
if (tab == null || (n = tab.length) ==