首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >concurrenthashmap java

concurrenthashmap java
EN

Stack Overflow用户
提问于 2012-11-04 09:39:38
回答 3查看 291关注 0票数 3

这似乎是错误的。

代码语言:javascript
复制
        static ConcurrentHashMap k; //multiple threads have access to k
         X o = k.get("LL");
         o.a = 6;
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-11-05 09:06:57

ConcurrentMap具有保证原子插入/删除和替换键/值对的条件操作。此外,访问ConcurrentMap会创建一个happens-before关系,这样您就可以对代码的顺序做出某些保证。

在给出的代码中,这一行:

代码语言:javascript
复制
X o = k.get("LL");

访问键"LL“的当前X值。下一行修改a属性。在不知道X的实现的情况下,这是Java,所以我们知道这里没有方法调用。如果(且仅当)a属性被标记为易失性,那么在"LL“处访问X的一些后续代码将看到a值为6。如果它不是易失性的,则根本没有保证。他们可能会看到6,特别是在SMP x86机器上,当时没有多少线程在做很多事情。在生产中,在一个大的NUMA盒子上,他们不太可能这样做。可变性带来了各种各样的复杂和困难。

通常,如果使用不可变键和值,您会发现更容易推断映射所处的状态。

票数 2
EN

Stack Overflow用户

发布于 2012-11-04 10:17:00

ConcurrentHashMap保证获得一个值是原子的,但它不能控制您如何处理从它获得的值。从ConcurrentHashMap的视图来看,修改hashmap中的值很好,但仍然可能不会产生您想要的行为。为了确保线程安全,您需要确切地考虑每个有权访问它的线程所做的事情。

将值放回ConcurrentHashMap中似乎是多余的,并且不会使整个操作更安全。您已经在任何同步之外修改了对象。

额外的同步可能是必要的,但如果没有看到更多的上下文,我就不能确定。

票数 2
EN

Stack Overflow用户

发布于 2012-11-04 09:44:34

简单地说:

代码语言:javascript
复制
  o.a=6

是一个原子操作,所有线程都将竞争,最后设置它的线程将“获胜”,覆盖该值。

更具体地说,ConcurrentHashMap只保证一个键和它的相关值之间的链接是在考虑多个线程的情况下处理的-例如,的put和get是原子

这不会阻止任何线程在获得对该值的引用后修改该值的属性!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13215264

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档