无参构造方法
//空参构造<br>publicConcurrentHashMap(){<br>//调用本类的带参构造<br>//DEFAULT_INITIAL_CAPACITY=16<br>//DEFAULT_LOAD_FACTOR=0.75f<br>//intDEFAULT_CONCURRENCY_LEVEL=16<br>this(DEFAULT_INITIAL_CAPACITY,DEFAULT_LOAD_FACTOR,DEFAULT_CONCURRENCY_LEVEL);<br>}
数据结构
Segment[],默认长度为16
每个Segement保存HashEntry[],默认长度为2
Segment
继承了ReentrantLock,是一个锁对象,实现了分段锁机制
HashEntry
初始容量为32
我们添加的元素,是存入对应的Segment中的HashEntry[]中。所以ConcurrentHashMap中默认元素的长度是32个,而不是16个
method
hash(Object k)
h ^=k.hashCode(),在经历一系列比较复杂的位运算,获取hash值
注意:键值对都不允许为null,否则报空指针异常
通过高位来获取segment[]的下标,通过低位来获取HashEntry[]的下标
put
1、首先尝试获取锁
获取到后,继续走到自己的方法
没获取到,走scanAndLockForPut(K key,int hash,V value)
scanAndLockForPut(K key, int hash,V value)
while(!try.Lock())锁的自旋
自旋次数会根据cpu的核数来判断,如果>1,则最大自旋数为64
如果自旋超过了64次,直接进行lock()操作
rehash(HashEntry<K,V> node)
size()
1、获取segment[]
2、获取modCount的累加值和真正size的累加
3、判断modCount和上次是否相同,不相同将modCount赋值给last,最少循环两次,当循环到第五次时会加锁
4、挨个解锁
5、如果溢出则返回int最大值,如果没有则返回size