currentHashMap简单理解
2018-06-08 本文已影响27人
南京杨小兵
currentHashMap结构
image.png
注意点:
1、currentHashMap的get方法因为存在volatile关键字的存在,所以get数据的时候非常高效,而且是最终数据。
2、currnetHashMap 是线程安全的,是因为:a、大的结构是分为一个一个segment,segment又是由hashEntry组成,锁是加在一个一个segment上面的,
所以当put一个数据的时候,与其他segment无关。b、currentHashMap 是先进行扩容校验,然后put数据。
3、size的方法,每个segment有个属性count 记录数据大小,
所以讲每个segment的count加起来就是size 的大小,但是因为volatile不能保证原子性,所以加锁统计大小,并不是每次直接加锁统计大小,
而是先尝试两次count累加,如果容器的count发生了变化,再加锁来累加count
内部 HashEntry 类 :
static final class HashEntry<K,V> {
final int hash;
final K key;
volatile V value;
volatile HashEntry<K,V> next;
HashEntry(int hash, K key, V value, HashEntry<K,V> next) {
this.hash = hash;
this.key = key;
this.value = value;
this.next = next;
}
}
需要重点理解volatile 关键字:volatile修饰变量时 通过信号量,更改其他线程的高速缓存中volatile关键字修饰变量状态为无效状态,
其他线程如果需要重写读取该变量会再次从主内存中读取,而不是读取自己的高速缓存中的。能保证最终数据一致性,但是并不能保证原子性