2017-08-11 72 views
1

一个内部类的实例获得一个外部类的实例在书中Java并发在实践中,当谈论的方式来发布对象,还有一个机制发布一个内部类实例,它是不是安全的,因为如何在Java

内部类实例包含一个隐藏的参考封闭 实例

我不知道如何来是不安全的,如果你不能得到外部类插件通过一个内部类实例,仅仅因为它会影响GC?我很困惑,是否有办法获得外部类实例,如反射?

+0

几岁那本书吗?理论上讲,内部类有一个对外部(或封闭类)的引用,而外部类对内部类有引用 - 这意味着对于GC(也许),两者都是**永远不可能**。 –

+0

书说,这是不好的话,制造的物体逃脱,我想这是不是唯一的GC,所以我不知道我是否能够通过反射来访问外部对象,如果我有一个内部对象。 – liuxl

+1

@ElliottFrisch的情况下,Java中使用ARC(自动引用计数)像一些编程语言做的,你是对的,但JVM使用可达性分析,这样既可以被释放,他们是不可达。 –

回答

0

它不会影响GC像你想象的。 JVM使用可达性分析,而不是自动引用计数,所以当它们都不能从起始主对象图中访问时,它们都可以被释放。

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

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