【发布时间】:2016-11-19 18:27:16
【问题描述】:
我的理解是,JSR-133 cookbook 是关于如何使用一系列内存屏障(或至少是可见性保证)实现 Java 内存模型的一个被广泛引用的指南。
根据对不同类型屏障的描述,我的理解也是,StoreLoad 是唯一保证所有 CPU 缓冲区都刷新到缓存并因此确保新读取(通过避免存储转发)并保证观察由于缓存一致性,最新的值。
我正在查看易失性/常规存储/加载的不同程序顺序交错所需的特定障碍表以及需要哪些内存障碍。
根据我的直觉,这张表似乎不完整。例如,Java 内存模型保证监视器的获取操作对在另一个线程中发布之前执行的所有操作的可见性,即使正在更新的值是非易失性的。在上面链接的表格中,似乎刷新 CPU 缓冲区和传播更改/允许观察新更改的唯一操作是 Volatile Store 或 MonitorExit,然后是 Volatile Load 或 MonitorEnter。我看不到在我上面的示例中障碍如何保证可见性,当这些操作(根据表)仅使用 LoadStore 和 StoreStore 时,据我所知,它们只涉及线程中的重新排序并且不能强制执行之前发生的事情保证(即跨线程)。
我在这里的理解哪里出错了?或者这个实现是否只强制发生在之前而不是同步保证或获取/释放监视器的额外操作。
谢谢
【问题讨论】:
标签: java multithreading concurrency cpu cpu-cache