这似乎是错误的。
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 会创建一个发生在之前 http://docs.oracle.com/javase/specs/jls/se5.0/html/memory.html#17.4.5关系,以便您可以对代码的顺序做出一定的保证。
在所提供的代码中,该行:
X o = k.get("LL");
访问键“LL”的当前 X 值。下一行修改 a 属性。在不知道X的实现的情况下,这是Java,所以我们知道这里没有方法调用。If(并且仅当)a 属性被标记为易失性时,随后访问“LL”处的 X 的代码才会将 a 值视为 6。如果它不是易失性的,则根本无法保证。他们可能会看到 6,特别是在 SMP x86 机器上,当时没有多少线程做太多事情。在生产中,在大型 NUMA 机器上,他们不太可能这样做。可变性会带来各种复杂性和困难。
一般来说,您会发现如果使用不可变的键和值,更容易推断出映射所处的状态。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)