这看起来不对。
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'或'k'上同步的情况下更新(o.a = #),会发生什么?
这看起来不对。
static ConcurrentHashMap k; //multiple threads have access to k
X o = k.get("LL");
o.a = 6;
ConcurrentMap具有条件操作,可以保证对键/值对的原子插入/删除和替换。此外,访问ConcurrentMap会创建happens-before关系,因此您可以对代码的排序作出一定的保证。
在呈现的代码中,该行:
X o = k.get("LL");
通常,如果使用不可变的键和值,则更容易理解映射所处的状态。
简单来说:
o.a=6
是一个原子操作,所有线程都会竞争,最后一个设置它的线程将“获胜”,覆盖该值。
更具体地说,ConcurrentHashMap仅保证处理键和其关联值之间的链接时考虑多个线程 - 即put和get是原子的。
这并不防止任何线程在获取对其的引用后修改值的属性!
o.a
的值为6
。 - MarioDS