gpt4 book ai didi

java - 为什么要在 SynchronizedMap 或 SynchronizedCollections 上同步?

转载 作者:搜寻专家 更新时间:2023-10-30 19:41:21 27 4
gpt4 key购买 nike

我指的是问题 here并使用作者代码示例,现在我的问题是

  1. 为什么作者使用synchronized(synchronizedMap),真的有必要吗,因为synchronizedMap总是确保没有两个线程试图对read/put操作 map 那么为什么我们需要在 map 上同步呢?

非常感谢您的解释。


  public class MyClass {
private static Map<String, List<String>> synchronizedMap =
Collections.synchronizedMap(new HashMap<String, List<String>>());

public void doWork(String key) {
List<String> values = null;
while ((values = synchronizedMap.remove(key)) != null) {
//do something with values
}
}

public static void addToMap(String key, String value) {
synchronized (synchronizedMap) {
if (synchronizedMap.containsKey(key)) {
synchronizedMap.get(key).add(value);
}
else {
List<String> valuesList = new ArrayList<String>();
valuesList.add(value);
synchronizedMap.put(key, valuesList);
}
}
}
}

最佳答案

why do we need to synchronize on that synchronizemap itself?

您可能需要对一个已经同步的集合进行同步,因为您正在对该集合执行两个操作——在您的示例中,一个 containsKey()然后是 put() .您正在尝试防范 race conditions调用集合的代码中。此外,在本例中,synchronized block 还保护 ArrayList值,以便多个线程可以将它们的值添加到这些未同步的集合中。

如果您查看链接到的代码,他们首先检查键是否存在,如果键不存在,则将值放入映射中。您需要防止 2 个线程检查 key 是否存在,然后将它们放入映射中。比赛是哪一个先放,哪一个将覆盖之前的放。

同步集合保护自己免受多个线程破坏 map 本身的影响。它不会防止围绕对 map 的多次调用的逻辑竞争条件。

synchronized (synchronizedMap) {
// test for a key in the map
if (synchronizedMap.containsKey(key)) {
synchronizedMap.get(key).add(value);
} else {
List<String> valuesList = new ArrayList<String>();
valuesList.add(value);
// store a value into the map
synchronizedMap.put(key, valuesList);
}
}

这是 ConcurrentMap 的原因之一。界面有 putIfAbsent(K key, V value); .那不需要需要两个操作,因此您可能不需要围绕它进行同步。

顺便说一句,我会将上面的代码重写为:

synchronized (synchronizedMap) {
// test for a key in the map
List<String> valuesList = synchronizedMap.get(key);
if (valueList == null) {
valuesList = new ArrayList<String>();
// store a value into the map
synchronizedMap.put(key, valuesList);
}
valuesList.add(value);
}

最后,如果 map 上的大部分操作需要在synchronized中进行无论如何阻止,你还不如不支付 synchronizedMap只需使用 HashMap总是在synchronized里面 block 。

关于java - 为什么要在 SynchronizedMap 或 SynchronizedCollections 上同步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11671801/

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