【问题标题】:How to get an outer class instance with an inner class instance in Java如何在Java中获取带有内部类实例的外部类实例
【发布时间】:2018-01-19 11:39:15
【问题描述】:

Java concurrency in practice一书中,在谈到发布对象的方式时,有一种机制是发布内部类实例,而不是安全因为

内部类实例包含对封闭类的隐藏引用 实例

我想知道如果你不能通过内部类实例获取外部类实例,为什么会不安全,只是因为它会影响 GC?我很困惑,是否有办法获取外部类实例,比如反射?

【问题讨论】:

  • 那本书有多久了?理论上,内部类引用了外部类(或封闭类),而外部类引用了内部类 - 这意味着对于 GC(可能),两者都永远无法访问。跨度>
  • 这本书说这样做很糟糕,使对象逃逸,而且我认为这不仅仅是关于 GC,所以我想知道如果我已经可以通过反射访问外部对象有一个内部对象。
  • @ElliottFrisch 如果 Java 像某些编程语言一样使用 ARC(自动引用计数),你是对的,但 JVM 使用可达性分析,因此两者都可以从它们无法访问的情况下释放出来。跨度>

标签: java reflection publish inner-classes outer-classes


【解决方案1】:

它不会像你想象的那样影响 GC。 JVM 使用可达性分析,而不是自动引用计数,因此当它们都无法从起始 main 的对象图中访问时,两者都可以被释放。

这是不安全的-我猜他们的意思是发布为序列化​​和发送-,因为通过引用,外部实例也将被序列化,从而导致更大的消息和/或序列化异常(如果它包含某些东西-非瞬态-不可序列化成员或自身不可序列化)。

我不确定外部对象引用名称是否以任何方式标准化,因此通过反射访问它们需要一些试验和错误(显然是测试)。

【讨论】:

    猜你喜欢
    • 2016-01-21
    • 1970-01-01
    • 1970-01-01
    • 2014-08-21
    • 1970-01-01
    • 2014-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多