如果访问线程是由先前分配变量的同一线程创建的,那么是否需要volatile?

时间:2013-12-23 15:11:50

标签: java multithreading thread-safety volatile

class MyClass {
    private int value;

    private void someFunction()
    {
        // value will never be assigned anywhere else while the thread is running
        this.value = 10;

        // start thread that reads value
    }
}

这需要一个volatile还是保证看到最新值的线程?

1 个答案:

答案 0 :(得分:5)

  

这需要一个volatile还是保证看到最新值的线程?

不,volatile不是必需的。该Java语言定义表明,创建的线程将在调用start()之前看到创建线程所做的所有更新。

Synchronization Order (JLS 17.4.4)。引用:

  
      
  • 启动线程的操作与其启动的线程中的第一个操作同步。
  •   

显然,如果值在start()之后更新,或者如果新线程更改了起始线程需要看到的值,则需要进行内存同步。

如果您致电thread.join(),情况也是如此。在join()返回后,调用者可以看到由加入的线程所做的任何更新。