是否设置了以下代码来正确同步 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()
中的同步块来阻止另一个线程在我通过对 put()
的调用之前调用 remove()
或 containsKey()
,但是我不需要 doWork()
中的同步块,因为在 remove()
返回之前,另一个线程不能进入 addToMap()
中的同步块,因为我最初用 Collections.synchronizedMap()
创建了 Map。是这样吗?还有更好的办法吗?