用最终的外部 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"。但是,这不足以全面保证它都是线程安全的。
一般来说,只有完整且可执行的代码的线程安全性才有意义。当你有省略号时,你必须考虑 可能 的所有 可能 代码......包括可能是非线程的东西-安全的。推理变得困难。
我在 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"。但是,这不足以全面保证它都是线程安全的。
一般来说,只有完整且可执行的代码的线程安全性才有意义。当你有省略号时,你必须考虑 可能 的所有 可能 代码......包括可能是非线程的东西-安全的。推理变得困难。