这似乎是错误的。
static ConcurrentHashMap k; //multiple threads have access to k
X o = k.get("LL");
o.a = 6;
如果多个线程并发访问 k,并获取 k("LL"),则不使用 k.put("ll",o) 更新 (o.a = #),不在 'o' 或 'k' 上同步会发生什么?
最佳答案
ConcurrentMap 具有保证原子插入/删除和替换键/值对的条件操作。此外,访问 ConcurrentMap 会创建一个 happens-before关系,以便您可以对代码的顺序做出某些保证。
在提供的代码中,行:
X o = k.get("LL");
访问键“LL”的当前 X 值。下一行修改 a 属性。不知道 X 的实现,这是 Java,所以我们知道这里没有方法调用。 如果(且仅当)a 属性被标记为 volatile,那么在“LL”处访问 X 的一些后续代码会将 a 值视为 6。如果它不是 volatile,则无法保证根本。他们可能会看到 6,特别是在 SMP x86 机器上,当时没有多少线程做很多事情。在生产中,在一个大的 NUMA 盒子上,他们不太可能这样做。可变性带来了各种复杂性和困难。
通常,如果您使用不可变的键和值,您会发现更容易推断出 map 所处的状态。
关于java - 并发 HashMap java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13215264/