【发布时间】:2015-01-09 19:41:51
【问题描述】:
使用 remove() 方法好吗?我读过一篇文章说同步没有被添加到remove方法中。如何从 ConcurrentHashMap 中正确删除 特定 项?
示例代码:
ConcurrentHashMap<String,Integer> storage = new ConcurrentHashMap<String,Integer>();
storage.put("First", 1);
storage.put("Second", 2);
storage.put("Third",3);
//Is this the proper way of removing a specific item from a tread-safe collection?
storage.remove("First");
for (Entry<String, Integer> entry : storage.entrySet()) {
String key = entry.getKey();
Object value = entry.getValue();
// ...
System.out.println(key + " " + value);
}
【问题讨论】:
-
“我读过一篇文章说 remove 方法中没有添加同步” 那篇文章写的是 Java 5、6、7 还是 8 的时代?也许它是考虑到较旧的 Java 版本编写的。
-
希望此链接有效javarevisited.blogspot.ca/2013/02/…。他说“由于 put()、remove()、putAll() 或 clear() 等更新操作未同步阅读更多:javarevisited.blogspot.com/2013/02/…”
-
@peter.petrov - 像我在代码示例中所做的那样在 ConcurrentHashMap 上调用 remove 方法是可以的,对吗?线程安全应该不是问题?
-
不完全确定。我猜这篇文章的意思如下:在
remove中,并非整个表都被锁定,而只是锁定了其中的一部分(如 manouti 发布的代码所示)。至少这就是我阅读这篇文章及其含义的方式。所以这一切都取决于你的并发场景。不确定,如果我要确定地回答,需要自己从头开始研究。 -
@peter.petrov - 嗯,那我如何从 concurrecthashmap 中删除特定项目?
标签: java thread-safety java.util.concurrent concurrenthashmap