hashmap(JAVA8)为什么线程不安全

我们分析一下源码put(K key,V value)的实现过程

    public V put(K key, V value) {
        return putVal(hash(key), key, value, false, true);
    }
    final V putVal(int hash, K key, V value, boolean onlyIfAbsent,
                   boolean evict) {
         //这里是核心,大概就是各种判断,然后赋值的问题,感兴趣的可以自己去了解一下。
        ++modCount;
        if (++size > threshold)
            resize();
        afterNodeInsertion(evict);
        return null;
    }

resize()方法是扩大容器的策略,在这里我们不用管(这个不重要吗??),不是我们讲解的重点,问题出在++size上面的,如果键是以前不存在的,那么必然会执行++size这段逻辑。假设现在我两个线程,每个线程都在执行put方法。
在这里插入图片描述
size的大致变化过程就是这样的,理论结果应该是size=3的,而我们实际执行的结果是size=2,remove()方法的原理也是差不多的,在这里就不详细解释。

摘自:https://blog.csdn.net/LovePluto/article/details/79712473

猜你喜欢

转载自blog.csdn.net/NIUBILISI/article/details/90037782