ConcurrentMap中的内存一致性效应

4
根据ConcurrentMap Javadoc的说法:
内存一致性效果:与其他并发集合一样,在将对象作为键或值放入ConcurrentMap之前的线程操作在另一个线程中访问或删除该对象之后发生。
上述语句的意思是什么?而且,由于get()方法不阻塞(与例如BlockingQueue相比),它如何起作用?

我注意到您还没有接受任何答案。请考虑在某个时候这样做! - GhostCat
2个回答

4
意思很简单。假设您有两个代码片段:
 a = new A();
 b = ...
 someConcurrentHashMap.put(b, whatever);

然后:

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

b是相同的对象并且这两个代码片段由不同的线程执行时,可以保证a = new A()发生在c = new C()之前。关于“发生在”更多阅读,请参见此处
对于实现细节,我建议您研究源代码代码 - 其中包含大量(非javadoc!)注释,解释了该类的内部工作原理。

1
GhostCat已经解释了“happens-before”的含义。然而,值得注意的是这与“blocking”之间的区别。
在一个阻塞队列中,试图从队列中轮询的线程将等待直到有可用的内容。
对于像ConcurrentHashMap这样的东西,情况并非如此。发生在添加到地图中之前的所有操作仅意味着另一个线程访问它时仍然发生。但这并不意味着其他线程将等待具有给定键的内容可用。
为了举个重要的例子,请考虑两个类foo和bar。在Foo的构造函数中,我们将其添加到Bar中的列表中。现在,我们将这个Foo实例放入ConcurrentHashMap中,并在另一个线程中访问它。逻辑上来说,我们对该Foo实例所做的一切都仍然发生了。但是,Java还会确保Foo实例已添加到Bar列表中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接