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

Mon*_*eur 1 java multithreading volatile thread-safety

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
    }
}
Run Code Online (Sandbox Code Playgroud)

这是否需要易失性或线程保证看到最新值?

Gra*_*ray 5

这是否需要易失性或线程保证看到最新值?

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

请参阅同步顺序(JLS 17.4.4).报价:

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

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

如果你打电话也是如此thread.join().join()返回后,调用者可以看到由连接的线程进行的任何更新.