Java HashMap.get(Object) infinite loop
关于SO的一些答案提到,如果未正确同步,HashMap中的get方法可能会陷入无限循环(例如,这个或这个)(通常底线是“不要在多线程环境中使用HashMap,使用ConcurrentHashMap”)。
虽然我可以很容易地理解为什么对HashMap.put(Object)方法的并发调用会导致无限循环,但我不太明白为什么get(Object)方法在尝试读取当时正在调整大小的HashMap时会卡住。我看了一下openjdk中的实现,它包含一个循环,但退出条件迟早应该满足。它怎么能永远循环?明确提到的容易受到此问题攻击的一段代码是:e != null
public class MyCache {
private Map<String,Object> map = new HashMap<String,Object>();
public synchronized void put(String key, Object value){
map.put(key,value);
}
public Object get(String key){
// can cause in an infinite loop in some JDKs!!
return map.get(key);
}
}
有人可以解释一下,一个线程将一个对象放入HashMap并从中读取,如何以一种生成无限循环的方式交错?它是否与某些缓存一致性问题或CPU指令重新排序有关(因此问题只能发生在多处理器计算机上)?