这个多线程代码中是否需要volatile关键字?

时间:2015-01-04 14:27:05

标签: java multithreading 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;  
  }

}

我不明白为什么在声明boolean" hasDataToProcess"时没有使用volatile关键字。如果线程A将其设置为true,它可能只会反映在其本地缓存中,而不会反映在主内存中,因此如果从主内存或其单独的本地缓存读取,线程B可能永远不会将其设置为true? / p>

在本教程的前一章中,作者解释了声明变量volatile的重要性,但他提出了一个不符合早期指南的例子,所以我对volatile的使用有点困惑。

请帮助理解何时使用或不使用volatile以及这段代码是否需要?如果是,为什么?如果没有,为什么不呢?

1 个答案:

答案 0 :(得分:2)

没有

hasDataToProcess的所有访问都在同一个锁上的synchronized块内。 <{1}}不是必需的。