我有一个Hashmap,出于速度原因,我不想要锁定.如果我不介意陈旧的数据,那么更新它并同时访问它会导致任何问题吗?
我的访问是获取,而不是遍历它,删除是更新的一部分.
我最近在代码库上遇到了一个扩展HashMap并同步put方法的类.
除了使用ConcurrentHashMap效率低之外,扩展HashMap和仅同步put(K,V)可能会出现什么样的问题?
假设我们不关心get(K)是否返回最新值(例如,我们可以使用线程覆盖彼此,并且我们不关心如果使用地图的值可能出现的竞争条件作为锁自己).
例:
public class MyMap<K,V> extends HashMap<K,V> {
//...
public synchronized void put(K key, V value) {
//...
}
//...
}
Run Code Online (Sandbox Code Playgroud)
据我所知,HashMap使用put方法重新调整大小,并且由于put在地图实例级别同步,因此在并发重新调整大小期间遇到的问题(可能)不会遇到.
即使有上面可疑的假设,我的直觉也告诉我,可能会出现更多问题.或者我只是偏执狂?
更新:谢谢大家,这很有趣,很有启发性.如果我遇到这个特定班级的作者的原作,我现在可以详细解释他的愚蠢.:)
总结:putAll仍然可以搞砸数据结构,最终陷入可怕的无限循环/数据争用状态.get依赖于hashmap的底层内部数据结构,这些结构可能正在被同时修改,导致get进程表现得很奇怪.这只是个坏主意.至少,作者可能已经使用了Collections.synchronizedMap(Map).
注意:截至本文撰写时给出的所有三个答案实际上都是正确的,但我选择了一个关于get()作为正确答案的答案,因为它对我来说是最不明显的答案.