如果我运行单核机器上的应用程序,volatile关键字有什么用?
Is volatile keyword of any use if I run the application in single core machine?
我最近熟悉了 volatile
关键字,我发现不直接从主内存读取会导致不一致和所谓的可见性问题。
我相信 CPU 缓存不特定于任何线程。所以我想知道 volatile
关键字在单核处理器中是否有用?
好吧,拥有单个或多个处理器(核心)肯定会影响整个程序运行有效并行的能力,您仍然可以创建多个线程,它们将拥有自己的缓存和volatile
关键字仍将按预期运行 - JLS 没有为关键字指定依赖于处理器的行为更改。
请注意,唯一不同的是有效并行,这不是关键字行为的决定因素。
硬件级并发性显然是规范动机的重要组成部分,但规范非常明确要求适用于整个系统;因此,例如,JVM 的 "just-in-time" (JIT) 编译器可以合法地优化等同于
while (this.var) {
... code that provably never modifies var ...
}
相当于
if (this.var) {
while (true) {
... code that provably never modifies var ...
}
}
如果 var
不是 volatile
。
我最近熟悉了 volatile
关键字,我发现不直接从主内存读取会导致不一致和所谓的可见性问题。
我相信 CPU 缓存不特定于任何线程。所以我想知道 volatile
关键字在单核处理器中是否有用?
好吧,拥有单个或多个处理器(核心)肯定会影响整个程序运行有效并行的能力,您仍然可以创建多个线程,它们将拥有自己的缓存和volatile
关键字仍将按预期运行 - JLS 没有为关键字指定依赖于处理器的行为更改。
请注意,唯一不同的是有效并行,这不是关键字行为的决定因素。
硬件级并发性显然是规范动机的重要组成部分,但规范非常明确要求适用于整个系统;因此,例如,JVM 的 "just-in-time" (JIT) 编译器可以合法地优化等同于
while (this.var) {
... code that provably never modifies var ...
}
相当于
if (this.var) {
while (true) {
... code that provably never modifies var ...
}
}
如果 var
不是 volatile
。