ConcurrentMap中的内存一致性效果

时间:2017-07-27 06:28:30

标签: java multithreading concurrency

根据ConcurrentMap Javadoc

  

内存一致性效果:与其他并发集合一样,在将对象放入ConcurrentMap作为键或值之前的线程中的操作发生在访问之后的操作之前或从另一个帖子中的ConcurrentMap中删除该对象。

上述陈述的含义是什么?它是如何工作的,因为get()中的ConcurrentHashMap方法没有阻止(例如与BlockingQueue相比)?

2 个答案:

答案 0 :(得分:4)

意思很简单。假设您有两段代码:

 a = new A();
 b = ...
 someConcurrentHashMap.put(b, whatever);

然后:

Whatever value = someConcurrentHashMap.get(b);
c = new C();

b相同的对象且这两段代码由两个不同的线程执行时,则保证a = new A() 发生在 c = new C()之前。

有关“之前发生”的进一步阅读 - 请参阅here

对于实现细节,我建议您研究源code - 包含的(非javadoc!)注释,这些注释解释了此类的内部工作原理。

答案 1 :(得分:1)

GhostCat已经解释了之前发生的意思。但是,可能值得注意这与“阻止”之间的区别。

在阻塞队列中,尝试从队列中轮询的线程将一直等到可用的东西。

对于类似ConcurrentHashMap的内容,情况并非如此。之前发生的关系简单意味着在将其添加到地图之前所做的一切仍然发生在另一个线程访问它时。但这并不意味着其他线程会等待具有给定密钥的东西可用。

举一个重要的例子,考虑两个类foo和bar。在Foo的构造函数中,我们将它添加到Bar中的列表中。现在我们将这个Foo实例放在ConcurrentHashMap中并在另一个线程中访问它。合乎逻辑的是,我们对Foo实例所做的一切仍然发生了。但是,Java还将确保Foo的实例仍被添加到Bar中的列表中。