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()方法的原理也是差不多的,在这里就不详细解释。
相关文章推荐
- 【Java】为什么HashMap是线程不安全的及其他
- HashMap为什么线程不安全
- 为什么HashMap是线程不安全的
- HashMap为什么是线程不安全的?
- HashMap为什么是线程不安全的?
- HashMap为什么是线程不安全的?
- HashMap为什么线程不安全
- 线程数组HashMap为什么是线程不安全的?
- HashMap为什么是线程不安全的?
- HashMap线程不安全的表现 -- Java 8
- Java 线程安全之volatile\StringBuffer\ArrayList\HashMap
- HashMap为什么是线程不安全的?
- HashMap为什么线程不安全(hash碰撞与扩容导致)
- java单例设计模式详解(懒汉饿汉式)+深入分析为什么懒汉式是线程不安全的+解决办法
- HashMap为什么是线程不安全的?
- HashMap为什么线程不安全(hash碰撞与扩容导致)
- 牛客网Java刷题知识点之为什么HashMap不支持线程的同步,不是线程安全的?如何实现HashMap的同步?
- HashMap为什么是线程不安全的?
- HashMap为什么是线程不安全的?
- Java中线程安全与线程非安全ArrayList,Vector 和 HashMap,Hashtable 和StringBuffer,StringBuilder