gpt4 book ai didi

java - 扩展 HashMap 并只同步 puts

转载 作者:搜寻专家 更新时间:2023-11-01 01:27:57 25 4
gpt4 key购买 nike

我最近在我们的代码库中遇到一个扩展 HashMap 并同步 put 方法的类。

除了比使用 ConcurrentHashMap 效率低之外,扩展 HashMap 并仅同步 put(K,V) 可能会出现什么样的问题?

假设我们不关心 get(K) 是否返回最新值(例如,我们可以接受线程相互覆盖并且我们不关心如果map 本身用作锁)。

例子:

public class MyMap<K,V> extends HashMap<K,V> {
//...
public synchronized void put(K key, V value) {
//...
}

//...
}

据我所知,HashMap 使用 put 方法调整其大小,并且由于 put 是在映射实例级别同步的,因此(可能)不会遇到并发调整大小时遇到​​的问题。

即使上述假设有问题,我的直觉告诉我可能会出现更多问题。还是我只是多疑?

更新:谢谢大家,这很有趣,也很有启发性。如果我遇到这个特定类的作者的原作者,我现在可以详细解释他的愚蠢行为。 :)

总结:putAll 仍然会把数据结构搞得一团糟,最终陷入可怕的无限循环/数据竞争状态。get 依赖于 hashmap 的底层内部数据结构,这些数据结构可能正在被并发修改,导致 get 进程行为异常。这只是一个普遍的坏主意。至少,作者可以改用 Collections.synchronizedMap(Map)。

注意:在撰写本文时给出的所有三个答案实际上都是正确的,但我选择了关于 get() 的一个作为正确答案,因为它对我来说是最不明显的一个。

最佳答案

我希望您也在 putAllremove 上同步。 putAll 特别是因为多个线程可以尝试调整 HashMap 的大小。这些方法也将更新 sizemodCount,如果在同步之外完成,可能会导致更新丢失。

关于java - 扩展 HashMap<K,V> 并只同步 puts,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12429997/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com