从未赋予null的volatile变量是否可以包含null?

scr*_*avy 10 java multithreading volatile

可以在以下概念Java示例中:

public class X implements Runnable {
    public volatile Object x = new Object();

    @Runnable
    public void run() {
        for (;;) {
            Thread.sleep(1000);
            x = new Object();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

x永远是null从另一个线程读取?

额外奖励:我是否需要将其声明为volatile(我并不关心该值,将来某个时候它将是新分配的值并且永远不会为空)

mar*_*ace 1

不会。Java 内存模型保证您永远不会将其视为xnull。 x必须始终是为其分配的初始值或某个后续值。

这实际上适用于任何变量,而不仅仅是volatile. 你问的这个问题叫“无中生有的价值观”。参见《Java Concurrency in Practice》,其中详细讨论了这个概念。

你的问题的另一部分“我需要声明x为易失性吗:”考虑到上下文,是的,它应该是volatile或者final. 两者之一为 引用的对象提供安全发布x。参见安全出版。 显然,x如果是的话,以后就无法更改final