【发布时间】:2014-02-04 13:14:01
【问题描述】:
我无法理解JSR-133 Coookbook 中StoreLoad 障碍的定义。
商店1;存储加载;加载2
StoreLoad 屏障使用 Store1 的数据值而不是从更新的存储到由不同处理器执行的相同位置的数据值来防止后续加载不正确。
这是否意味着如果没有 StoreLoad 屏障,处理器可以将 Store1 存储到其写入缓冲区并从其写入缓冲区加载此存储的值,即使其他处理器写入相同的内存位置并刷新到 Store1 和 Load1 之间的缓存?
【问题讨论】:
-
如果没有 StoreLoad 屏障,处理器可以只将数据写入其缓冲区而不与其他处理器同步(例如通过写入主存储器),因此另一个处理器可以从其缓冲区或从主存储器加载数据内存,但不会获得最新的值。
-
假设有一个全局变量 x。处理器 P1 写入 x(将 1 存储到 P1 的写入缓冲区),然后处理器 P2 将其对 x 的写入刷新到高速缓存(即使 x 的 P1 高速缓存行无效)。 P1 是否仍会从其写入缓冲区加载 x (Load2)?
-
如果没有使用 StoreLoad 屏障,没有什么会迫使 P1 不这样做!因此,共享状态的每次访问(写入和读取)都必须同步以保证线程安全。
标签: java multithreading concurrency cpu-architecture java-memory-model