【发布时间】:2015-03-02 05:19:23
【问题描述】:
我在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;
}
}
我不明白为什么在声明布尔值“hasDataToProcess”时不使用 volatile 关键字。如果线程 A 将其设置为 true,它可能只会反映在其本地缓存中而不是主内存中,因此如果线程 B 从主内存或从其单独的本地缓存中读取,可能永远不会看到它设置为 true?
在本教程的前一章中,作者解释了声明变量 volatile 的重要性,但随后他提出了一个不符合早期指南的示例,因此我对 volatile 的用法有点困惑。
请帮助了解何时使用或不使用 volatile 以及这段代码是否需要它?如果是,为什么?如果没有,为什么不呢?
【问题讨论】:
-
你在说什么“本地缓存”?
标签: java multithreading volatile