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

Bha*_*kar 4 java concurrency concurrenthashmap

ConcurrentHashMap在Java中提供读取以与更新同时进行.在这方面的权衡是读取的结果仅限于反映读数开始时的最后完成更新,因此未指定反映元素的最新状态.

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

鉴于读取线程不会阻塞写入线程,是什么形成了保证读取线程可用的上次完成更新的可见性的基础?

我只能在比较和交换算法的方面考虑一些事情,但我无法在该工程的源代码中验证它.

Joh*_*int 5

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

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