使用最终外部类对象实例化内部类是否是线程安全的?

时间:2015-03-10 07:30:52

标签: java multithreading thread-safety instantiation inner-classes

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

本教程包含简单示例:

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

这样的实例化:

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

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

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()

1 个答案:

答案 0 :(得分:0)

  

使用最终外部类对象实例化内部类是否是线程安全的?

一般来说,这取决于具体情况。在你的例子中也是如此。

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

我们可以肯定地说,有一个"发生之前"在outerObject = new OuterClass()outerObject.new InnerClass()之间。但是,这并不足以确保它是全线程安全的。


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