【发布时间】:2021-03-01 18:36:30
【问题描述】:
如果我有一个哈希映射和这个方法:
private Map<String, String> m = new HashMap<>();
private void add(String key, String value) {
String val = m.get(key);
if (val == null) {
m.put(key, value);
}
}
如果我有两个线程 A 和 B 调用具有相同键和值的方法,A 和 B 可能都看到键不在映射中,因此可能同时写入映射。但是,写入顺序(A 在 B 之前或 B 在 A 之前)不应影响结果,因为它们都写入相同的值。但我只是想知道并发写入是否会很危险并可能导致意想不到的结果。在这种情况下,我可能应该使用 ConcurrentHashMap。
【问题讨论】:
-
你所拥有的肯定是错误的。
add()需要同步,m需要为final或volatile。ConcurrentHashMap不会解决这些问题。 -
只是在我的情况下,他们总是为每个键写入相同的值,所以我认为同步没有必要。关于 final 和 volatile 的好点,但我看到了这个,也许 final 就足够了,我们不需要 volatile? stackoverflow.com/questions/29404851/…
-
final就够了,你需要一个但不能同时两个。 -
如果你使用
putIfAbsent,则不需要synchronized。 -
如果我使用 synchronized 我想我们甚至不需要 final 来实现内存可见性?
标签: java concurrency