【发布时间】:2018-03-12 17:49:35
【问题描述】:
我尝试将代码运行到this question 的已接受答案,它在我的机器上无限期地运行。导致这种行为的幕后原因是什么?即什么是一个线程看到另一个线程不是?人们谈论没有刷新到主内存的“缓存”,但这个缓存在哪里?它位于JVM中,是CPU内存缓存还是CPU寄存器?
【问题讨论】:
标签: java concurrency
我尝试将代码运行到this question 的已接受答案,它在我的机器上无限期地运行。导致这种行为的幕后原因是什么?即什么是一个线程看到另一个线程不是?人们谈论没有刷新到主内存的“缓存”,但这个缓存在哪里?它位于JVM中,是CPU内存缓存还是CPU寄存器?
【问题讨论】:
标签: java concurrency
正如您指出的问题中所解释的,没有 volatile 关键字的变量可以由编译器、JIT、处理器以任何方式优化,因此不会从共享内存中读取。因此,变量可以存储在线程的 CPU 寄存器中,并以具有不同值的两个独立变量(一个由线程)结束。
这解释了为什么volatile 关键字很有用。如果没有这个关键字,同样的代码可能会也可能不会按预期工作。
where 是缓存问题很难回答,因为我认为没有好的答案。它可以在任何层上。
编辑:@polygnome 在评论中发布的链接很棒。你绝对应该阅读它。
【讨论】: