是否设置了以下代码以正确同步synchronizedMap上的调用?

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);
      }
    }
  }
}

据我了解,我需要addToMap()中的同步块(synchronized block)来阻止另一个线程在调用remove()之前调用containsKey()put(),但是我不需要doWork()中的同步块(synchronized block),因为另一个线程无法在addToMap()之前输入remove()中的同步块(synchronized block)会返回,因为我最初是使用Collections.synchronizedMap()创建 map 的。那是对的吗?有一个更好的方法吗?

最佳答案

Collections.synchronizedMap()保证您要在 map 上运行的每个原子操作都将被同步。

但是,必须在一个块中同步在 map 上运行两个(或多个)操作。
是的-您正在正确同步。

10-07 19:34