gpt4 book ai didi

java - volatile 读取和非 volatile 字段

转载 作者:行者123 更新时间:2023-11-30 06:47:43 27 4
gpt4 key购买 nike

看完this questionthis (尤其是第二个答案)我对 volatile 及其与内存屏障有关的语义感到非常困惑。

在上面的例子中,我们写入了一个 volatile 变量,这会导致一个 mfence,它反过来将所有挂起的存储缓冲区/加载缓冲区刷新到主缓存,使其他缓存行无效。

但是,非 volatile 字段可以优化并存储在寄存器中吗?那么,我们如何确保写入 volatile 变量之前的所有状态更改都是可见的?如果我们改变 1000 个东西会怎样?

最佳答案

JMM 提供的保证是 - 如果线程 1 写入一个 volatile 变量,然后线程 2 读取同一个 volatile 变量,那么线程 2保证看到所有 线程 1 在写入 volatile 变量之前所做的更改(包括对非 volatile 变量所做的更改)。这是一个强有力的保证,存在并且每个人都同意。

但是,保证仅适用于线程 2 看到的内容。 您可能还有另一个线程,线程 3,它可能看不到线程 1 设置的非 volatile 字段的最新值(线程 3 可能有,并且被允许缓存值对于那些非 volatile 字段)。只有在线程 3 读取相同的 volatile 后,才能保证看到来自线程 1 的非 volatile 写入

关于java - volatile 读取和非 volatile 字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45602130/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com