5

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

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

鉴于读取线程不会与写入线程阻塞,那么保证读取线程可用的最后完成更新的可见性的基础是什么?

我只能想到比较和交换算法在起作用,但我无法在该库的源代码中验证它。

4

1 回答 1

6

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

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

于 2011-10-27T14:03:01.080 回答