以下代码是否设置为正确同步上的调用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()
防止另一个线程调用remove()
or containsKey()
在我接听电话之前put()
但我不需要同步块doWork()
因为另一个线程无法进入同步块addToMap()
before remove()
返回,因为我最初创建了地图Collections.synchronizedMap()
。那是对的吗?有一个更好的方法吗?
Collections.synchronizedMap()
保证您想要在地图上运行的每个原子操作都将被同步。
然而,在地图上运行两个(或更多)操作必须在一个块中同步。
所以是的 - 您正在正确同步。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)