ConcurrentHashMap非阻塞读取和内存可见性问题

时间:2011-10-27 13:58:23

标签: java concurrency concurrenthashmap

Java中的

ConcurrentHashMap提供了与更新同时进行的读取。这样做的权衡是读取的结果仅限于在读取开始时仅反映上次完成的更新,因此未指定反映元素的最新状态。

然而,AFAIK Java内存模型,在读写线程之间没有某种形式的同步,即使在任意时间段之后,写线程的更新也可能对读线程不可见。

鉴于读取线程不会阻塞写入线程,是什么形成了保证最后完成的更新可见的基础,以供读取线程使用?

我只能在比较和交换算法的路线上想到一些东西,但我无法在该工程的源代码中验证它。

1 个答案:

答案 0 :(得分:5)

值的读取实际上是易失性负载。虽然它是非阻塞的,但您将确保之前发生的关系,因为商店也是易变的。

Java 5,6,7版本的CHM不使用CAS来交换引用。但是在作品中有一个更新的轻量级版本可用于它的一些写作。