gpt4 book ai didi

java - 是否有任何理由使用同步的 HashMap 而不是 ConcurrentHashMap?

转载 作者:行者123 更新时间:2023-12-01 14:07:57 24 4
gpt4 key购买 nike

在多线程应用程序中,是否存在在需要时使用带同步功能的 HashMap 比使用 ConcurrentHashMap 更好的场景?

具体来说,我正在考虑这样一个 map 初始化的应用程序:

Map<String,String> map = new HashMap<>();

每个线程访问 map 只是为了更新它并立即将其转换为字符串,因此唯一同步的 block 是:

synchronized(map) {
map.put(key,value);
StringBuilder sb = new StringBuilder();
for (String k: map.keySet())
sb.append("("+k+","+map.get(k)+")");
}

在这种情况下,将初始化更改为:

Map<String,String> map = new ConcurrentHashMap<>();

并删除“同步”?

最佳答案

问题是从应用程序的角度来看,什么对您很重要。如果您希望在调用 put 方法后将映射的字符串转换与状态同步,那么您的代码是唯一的解决方案。

如果我们说你的同步之前的 map 状态会阻止它:

  • key1:value1
  • key2:value2

然后你调用你的代码

key = "key3" and value="value3"

同步块(synchronized block)确保字符串转换将是

(key1,value1)(key2,value2)(key3,value3)

如果您删除同步块(synchronized block)并将映射更改为某些同步实现,则唯一同步的部分将被放置自己。所以方法调用的时间线在某些情况下可以是:

  • 线程1 put(x,x)
  • 线程2 put(x,x)
  • Thread1 用于循环到字符串的转换
  • Thread2 用于循环到字符串的转换

所以 Thread1 转换了不正确的状态,因为 Thread2 足够快,可以在 Thread1 调用字符串转换之前放置一个新条目。

任何集合的一般同步实现仅在您希望集合方法作为原子操作的情况下才有用。如果您需要在相同的集合状态下协作更多方法,您必须每次都从外部同步它们。

关于java - 是否有任何理由使用同步的 HashMap 而不是 ConcurrentHashMap?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47589992/

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