【发布时间】:2017-01-13 01:25:22
【问题描述】:
跟进这个问题(Java thread safety - multiple atomic operations?),我不想再添加更多问题,但现在我有这个疑问:
private final Map<String, Set<String>> data = Maps.newConcurrentMap();
... then in a method ...
if (data.containsKey("A")) {
data.get("A").add("B");
}
应该是这样的:
synchronized(data) {
if (data.containsKey("A")) {
data.get("A").add("B");
}
}
为了线程安全。对吗?
所以操作是原子的,但是将它们组合起来需要同步,对吗?到那时,我们手动处理同步时,只使用简单的 HashMap 而不是并发的是否有意义?
在 CHM 中是否有任何方法可以使这项工作原子化?
【问题讨论】:
-
相对于简单 HashMap 的一个优势是 CHM 仍然不需要读取器同步。
-
请同时显示修改 CHM 的代码。就 Map 而言,上述代码是只读的(仅调用
get和containsKey)。 -
computeIfPresent 不是为此而生的吗?
-
请问您使用的是哪种线程安全的集合?
-
@shmosel 我正在使用这个:google.github.io/guava/releases/snapshot/api/docs/com/google/…
标签: java multithreading concurrenthashmap