currentHashMap简单理解

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关键字修饰变量状态为无效状态,
其他线程如果需要重写读取该变量会再次从主内存中读取,而不是读取自己的高速缓存中的。能保证最终数据一致性,但是并不能保证原子性

推荐阅读更多精彩内容