我在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()
)
答案 0 :(得分:0)
使用最终外部类对象实例化内部类是否是线程安全的?
一般来说,这取决于具体情况。在你的例子中也是如此。
functn
中执行的实例化的线程安全性取决于InnerClass
的构造函数(未显示)和其他初始化(未显示)是否是线程安全的,并且(间接)是否是OuterClass
实例化是线程安全的。
我们可以肯定地说,有一个"发生之前"在outerObject = new OuterClass()
和outerObject.new InnerClass()
之间。但是,这并不足以确保它是全线程安全的。
通常,谈论完整且可执行的代码的线程安全性才有意义。当你有省略号时,你必须考虑可能所有的可能的代码......包括可能是非线程安全的东西。推理变得困难。