【问题标题】:Can a reordering happen in the presence of a volatile variable? [duplicate]在 volatile 变量存在的情况下会发生重新排序吗? [复制]
【发布时间】:2014-10-22 07:13:18
【问题描述】:

我的做法如下,我的程序只有2个线程。

// Thread 1
write a = 0
write a = 1
write volatile b = 1

// Thread 2
read volatile b // this I always do after write volatile b in the 1st thread
read a

我已经阅读了 Java 内存模型,根据我在线程 2 中的理解,read a 总是会给我 1。

我想知道我的理解是否正确。

特别是仍然会发生重新排序,所以我在第二个线程中看到 a = 0 吗?

【问题讨论】:

    标签: java volatile


    【解决方案1】:

    您的假设大多是正确的。但是,我会稍微重申一下,以符合 JMM 的保证。

    如果线程 2 读取 b 并看到值 1,那么后续读取的 a 将是 1。就像你说的,如果线程 2 总是读取 b "after" Thread 1 完成写入,然后线程 2 将看到值 1,a 的读取将如您所愿。

    【讨论】:

    • 我仍然不明白为什么线程 1 中不能发生重新排序。为什么 a 不能为 0?哦,唉,我就是不明白,能否请您参考 JLS 规范中的说明?
    • @Alex - 链接问题的答案引用了 JLS。基本上,您不能将任何写入移动到易失性写入之后,也不能将任何读取移动到易失性读取之前。
    猜你喜欢
    • 2011-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-24
    • 2020-05-02
    • 1970-01-01
    • 1970-01-01
    • 2012-11-05
    相关资源
    最近更新 更多