如果访问线程是由先前分配变量的同一线程创建的,那么是否需要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,或者线程是否保证看到最新的值?

这是否需要volatile,或者线程是否保证看到最新的值?

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

参见同步订单(JLS 17.4.4)。报价:

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

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

如果调用thread.join(),情况也是如此。在join()返回后,调用方会看到与联接的线程所做的任何更新。

最新更新