我最近遇到了一个扩展HashMap和同步put方法我们的代码库的类。
除了它比使用ConcurrentHashMap的效率较低,可以延伸HashMap和同步容下(K,V)出现什么样的问题?
假设我们不关心是否可以得到(K)返回的最新值或没有(如我们罚款线程互相覆盖并且如果使用的地图的值,我们不关心可能出现的可能的竞争条件为锁定自己)。
例:
public class MyMap<K,V> extends HashMap<K,V> {
//...
public synchronized void put(K key, V value) {
//...
}
//...
}
据我所知,HashMap中做了重新的大小与put方法和自投放在地图实例级同步,同时重新上浆过程中遇到的问题,将(可能)不会遇到。
即使有上述问题的假设,我的直觉,感觉告诉我,有可能出现更多的问题。 或者,我只是被偏执?
更新:谢谢大家,这是乐趣和启发。 如果我见到这个特定类的作者原来的,我现在可以解释他的详细愚蠢。 :)
总结:的putAll仍然可以弄糟数据结构可怕和可怕的无限循环/数据争用条件结束。 得到依赖于哈希映射的可能处于被修改同时使的get过程的行为古怪的过程中底层的内部数据结构。 这仅仅是一个普遍糟糕的主意。 最起码,笔者也可以使用Collections.synchronizedMap(地图)代替。
注:鉴于在写这篇文章的所有三个答案其实是正确的,但我选择了一个大约的get()为正确答案,因为这是最不明显的一个我。