【问题标题】:Is it thread safe to instantiate inner class with a final outer class object?用最终的外部类对象实例化内部类是否线程安全?
【发布时间】:2015-03-10 07:30:51
【问题描述】:

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

【问题讨论】:

  • 您的问题不清楚(例如,该行可能是一个局部变量,根据定义,它是线程安全的)-您能展示一个完整的示例吗?
  • 这取决于“...”中的内容
  • @assylias 示例已添加。
  • @StephenC 如果内部类只包含一些字段,普通的getter和setter,而静态方法只是在内部对象中设置一些值,那完全没有问题,对吧?
  • @Griddoor - 字段是否已初始化?有构造函数吗?

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


【解决方案1】:

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

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

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

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


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

【讨论】:

  • 我想我现在明白了。当然,当构造函数包含非线程安全的危险代码时,我不应该同时进行实例化。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多