Java synchronized block vs. Collections.synchronizedMap(Java 同步块与 Collections.synchronizedMap)
问题描述
以下代码是否设置为正确同步 synchronizedMap
上的调用?
Is the following code set up to correctly synchronize the calls on 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()
或 containsKey()
在我完成对 put()
的调用之前,但我不需要 doWork()
中的同步块,因为另一个线程无法进入 addToMap()
在 remove()
返回之前,因为我最初使用 Collections.synchronizedMap()
创建了地图.那是对的吗?有没有更好的方法来做到这一点?
From my understanding, I need the synchronized block in addToMap()
to prevent another thread from calling remove()
or containsKey()
before I get through the call to put()
but I do not need a synchronized block in doWork()
because another thread cannot enter the synchronized block in addToMap()
before remove()
returns because I created the Map originally with Collections.synchronizedMap()
. Is that correct? Is there a better way to do this?
推荐答案
Collections.synchronizedMap()
保证你想在地图上运行的每个原子操作都会被同步.
Collections.synchronizedMap()
guarantees that each atomic operation you want to run on the map will be synchronized.
但是,在地图上运行两个(或更多)操作必须在一个块中同步.所以是的 - 你正在正确同步.
Running two (or more) operations on the map however, must be synchronized in a block. So yes - you are synchronizing correctly.
这篇关于Java 同步块与 Collections.synchronizedMap的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:Java 同步块与 Collections.synchronizedMap
基础教程推荐
- 如何强制对超级方法进行多态调用? 2022-01-01
- 如何对 HashSet 进行排序? 2022-01-01
- 如何使用 Stream 在集合中拆分奇数和偶数以及两者的总和 2022-01-01
- 首次使用 Hadoop,MapReduce Job 不运行 Reduce Phase 2022-01-01
- 由于对所需库 rt.jar 的限制,对类的访问限制? 2022-01-01
- 如何在不安装整个 WTP 包的情况下将 Tomcat 8 添加到 Eclipse Kepler 2022-01-01
- 在螺旋中写一个字符串 2022-01-01
- Java 中保存最后 N 个元素的大小受限队列 2022-01-01
- Spring Boot Freemarker从2.2.0升级失败 2022-01-01
- 如何使用 Eclipse 检查调试符号状态? 2022-01-01