用最终的外部 class 对象实例化内部 class 是线程安全的吗?

Is it thread safe to instantiate inner class with a final outer class object?

我在 oracle.com 上阅读了关于内部 class 的教程: http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html

教程包含简单示例:

class OuterClass {
    ...
    class InnerClass {
        ...
    }
}

这样的实例化:

OuterClass.InnerClass innerObject = outerObject.new InnerClass();

我的问题是我是否有外部的最终实例 class:

public class OuterClass {
    private static final OuterClass outerObject = new OuterClass();
    class InnerClass{
        //... some fields, methods here
    }
    public static void functn(){
        InnerClass innerObject = outerObject.new InnerClass();
        //... use the inner object...
    }
}

那我可以安全地同时在2个线程中进行实例化吗? (在 2 个线程中调用 functn()

Is it thread safe to instantiate inner class with a final outer class object?

总的来说,这取决于上下文。在您的示例中也是如此。

functn 中执行的实例化的线程安全取决于 InnerClass 的构造函数(未显示)和其他初始化(未显示)是否线程安全,并且(间接) OuterClass 实例化是否是线程安全的。

我们可以肯定地说的一件事是outerObject = new OuterClass()outerObject.new InnerClass()之间有一个"happens before"。但是,这不足以全面保证它都是线程安全的。


一般来说,只有完整且可执行的代码的线程安全性才有意义。当你有省略号时,你必须考虑 可能 的所有 可能 代码......包括可能是非线程的东西-安全的。推理变得困难。