ConcurrentMap 中的内存一致性效果



根据JavadocConcurrentMap

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

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

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

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

然后:

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

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

有关"发生之前"的进一步阅读 - 请参阅此处。

对于实现细节,我建议您研究源代码 - 其中包含大量(非javadoc!(注释来解释此类的内部工作原理。

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

在阻塞队列中,尝试从队列轮询的线程将等待,直到有可用的内容。

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

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

最新更新