1

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

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

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

4

1 回答 1

0

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

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

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

于 2017-08-11T06:00:26.237 回答