这似乎是错误的。
static ConcurrentHashMap k; //multiple threads have access to k
X o = k.get("LL");
o.a = 6;发布于 2012-11-05 09:06:57
ConcurrentMap具有保证原子插入/删除和替换键/值对的条件操作。此外,访问ConcurrentMap会创建一个happens-before关系,这样您就可以对代码的顺序做出某些保证。
在给出的代码中,这一行:
X o = k.get("LL");访问键"LL“的当前X值。下一行修改a属性。在不知道X的实现的情况下,这是Java,所以我们知道这里没有方法调用。如果(且仅当)a属性被标记为易失性,那么在"LL“处访问X的一些后续代码将看到a值为6。如果它不是易失性的,则根本没有保证。他们可能会看到6,特别是在SMP x86机器上,当时没有多少线程在做很多事情。在生产中,在一个大的NUMA盒子上,他们不太可能这样做。可变性带来了各种各样的复杂和困难。
通常,如果使用不可变键和值,您会发现更容易推断映射所处的状态。
发布于 2012-11-04 10:17:00
ConcurrentHashMap保证获得一个值是原子的,但它不能控制您如何处理从它获得的值。从ConcurrentHashMap的视图来看,修改hashmap中的值很好,但仍然可能不会产生您想要的行为。为了确保线程安全,您需要确切地考虑每个有权访问它的线程所做的事情。
将值放回ConcurrentHashMap中似乎是多余的,并且不会使整个操作更安全。您已经在任何同步之外修改了对象。
额外的同步可能是必要的,但如果没有看到更多的上下文,我就不能确定。
发布于 2012-11-04 09:44:34
简单地说:
o.a=6是一个原子操作,所有线程都将竞争,最后设置它的线程将“获胜”,覆盖该值。
更具体地说,ConcurrentHashMap只保证一个键和它的相关值之间的链接是在考虑多个线程的情况下处理的-例如,的put和get是原子。
这不会阻止任何线程在获得对该值的引用后修改该值的属性!
https://stackoverflow.com/questions/13215264
复制相似问题