【问题标题】:What is the underlying cause of thread visibility issues in Java? [duplicate]Java 中线程可见性问题的根本原因是什么? [复制]
【发布时间】:2018-03-12 17:49:35
【问题描述】:

我尝试将代码运行到this question 的已接受答案,它在我的机器上无限期地运行。导致这种行为的幕后原因是什么?即什么是一个线程看到另一个线程不是?人们谈论没有刷新到主内存的“缓存”,但这个缓存在哪里?它位于JVM中,是CPU内存缓存还是CPU寄存器?

【问题讨论】:

    标签: java concurrency


    【解决方案1】:

    正如您指出的问题中所解释的,没有 volatile 关键字的变量可以由编译器、JIT、处理器以任何方式优化,因此不会从共享内存中读取。因此,变量可以存储在线程的 CPU 寄存器中,并以具有不同值的两个独立变量(一个由线程)结束。

    这解释了为什么volatile 关键字很有用。如果没有这个关键字,同样的代码可能会也可能不会按预期工作。

    where 是缓存问题很难回答,因为我认为没有好的答案。它可以在任何层上。

    编辑:@polygnome 在评论中发布的链接很棒。你绝对应该阅读它。

    【讨论】:

    • 非常感谢您的回答。我认为@polygnome 已删除他的评论,您介意添加您提到的链接吗?
    • 您的问题被标记为已通过链接回答。检查该链接。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-12
    • 1970-01-01
    • 2011-08-11
    • 1970-01-01
    相关资源
    最近更新 更多