初始化对象的Java线程安全性

Ste*_*rts 2 java concurrency thread-safety

考虑以下课程:

public class MyClass
{
    private MyObject obj;

    public MyClass()
    {
        obj = new MyObject();
    }

    public void methodCalledByOtherThreads()
    {
        obj.doStuff();
    }
}
Run Code Online (Sandbox Code Playgroud)

由于obj是在一个线程上创建并从另一个线程访问的,因此当调用methodCalledByOtherThread时,obj可能为null吗?如果是这样,将obj声明为volatile是解决此问题的最佳方法吗?声明obj作为最终会有什么不同吗?

编辑:为清楚起见,我认为我的主要问题是:其他线程是否可以看到obj已经被某个主线程初始化或者obj可能是陈旧的(null)?

Sot*_*lis 7

对于methodCalledByOtherThreads由另一个线程调用并导致问题,该线程必须获得对其字段未初始化的MyClass对象的引用obj,即.构造函数尚未返回的位置.

如果您this从构造函数中泄漏了引用,则可以执行此操作.例如

public MyClass()
{
    SomeClass.leak(this); 
    obj = new MyObject();
}
Run Code Online (Sandbox Code Playgroud)

如果该SomeClass.leak()方法启动一个单独的线程调用methodCalledByOtherThreads()this引用,那么问题就出来了,但不管这是事实volatile.

由于你没有我上面描述的内容,你的代码很好.