在这个多线程代码中这里不需要 volatile 关键字吗?
Is not volatile keyword required here in this multithreaded code?
我在 http://tutorials.jenkov.com/java-concurrency/thread-signaling.html 上看到这个例子:
public class MySignal{
protected boolean hasDataToProcess = false;
public synchronized boolean hasDataToProcess(){
return this.hasDataToProcess;
}
public synchronized void setHasDataToProcess(boolean hasData){
this.hasDataToProcess = hasData;
}
}
我不明白的是为什么在声明布尔值时不使用 volatile 关键字 "hasDataToProcess"。如果线程 A 将其设置为 true,它可能只会反映在其本地缓存中而不是主内存中,因此如果线程 B 从主内存或其单独的本地缓存中读取,它可能永远不会看到它设置为 true?
在本教程的前一章中,作者解释了声明变量 volatile 的重要性,但随后他提供了一个不符合早期指南的示例,因此我对 volatile 的用法有点困惑挥发性。
请帮助理解何时使用或不使用 volatile 以及这段代码是否需要它?如果是,为什么?如果不是,为什么不呢?
没有
对 hasDataToProcess
的所有访问都在同一个锁上的块 synchronized
内。 volatile
不是必需的。
我在 http://tutorials.jenkov.com/java-concurrency/thread-signaling.html 上看到这个例子:
public class MySignal{
protected boolean hasDataToProcess = false;
public synchronized boolean hasDataToProcess(){
return this.hasDataToProcess;
}
public synchronized void setHasDataToProcess(boolean hasData){
this.hasDataToProcess = hasData;
}
}
我不明白的是为什么在声明布尔值时不使用 volatile 关键字 "hasDataToProcess"。如果线程 A 将其设置为 true,它可能只会反映在其本地缓存中而不是主内存中,因此如果线程 B 从主内存或其单独的本地缓存中读取,它可能永远不会看到它设置为 true?
在本教程的前一章中,作者解释了声明变量 volatile 的重要性,但随后他提供了一个不符合早期指南的示例,因此我对 volatile 的用法有点困惑挥发性。
请帮助理解何时使用或不使用 volatile 以及这段代码是否需要它?如果是,为什么?如果不是,为什么不呢?
没有
对 hasDataToProcess
的所有访问都在同一个锁上的块 synchronized
内。 volatile
不是必需的。