关于SO的一些答案提到,如果不能正确同步,HashMap中的get方法可能陷入无限循环(例如this one或this one)(通常底线是“don '在多线程环境中使用HashMap,请使用ConcurrentHashMap“)。Java HashMap.get(Object)无限循环
虽然我很容易明白为什么对HashMap.put(Object)方法的并发调用会导致无限循环,但我不明白为什么get(Object)方法在尝试读取HashMap时会卡住那时正在调整大小。我有一个看看implementation in 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指令重新排序有关(因此问题只能发生在多处理器机器上)?
你真的可以编译它并让它永久运行吗?看起来像一个异常将被抛出远远超过无限循环 –
为什么你不使用'AtomicReference'来“锁定”你的地图?你会得到其他的非线程安全问题。 –
这个练习是毫无意义的。 HashMap不是线程安全的,当另一个线程写入对象时,即使它永远不会进入无限循环,也可能返回错误的结果,破坏HashMap,抛出异常或任何其他线程。你为什么要这样做呢?只需同步get方法:有必要使代码线程安全。 –