我们分析一下源码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()方法的原理也是差不多的,在这里就不详细解释。