您的位置:首页 > 编程语言 > Java开发

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

2019-05-09 15:42 281 查看

我们分析一下源码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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: