在《实践中的Java并发》一书中,在谈到发布对象的方法时,有一种机制是发布内部类实例,这是不安全的,因为
内部类实例包含对封闭的隐藏引用 实例
我想知道,如果您无法通过内部类实例获取外部类实例,仅仅因为它会影响 GC,为什么不安全?我很困惑,是否有办法获取外部类实例,例如反射?
它不会像你想象的那样影响GC。JVM 使用可达性分析,而不是自动引用计数,因此当它们都无法从起始主的对象图访问时,可以释放它们。
这是不安全的 - 我猜他们的意思是发布为序列化和发送 - 因为通过引用,外部实例也将被序列化,从而导致更大的消息和/或序列化异常(如果它包含一些东西 - 非瞬态 - 不可序列化的成员或本身不可序列化(。
我不确定外部对象引用名称是否以任何方式标准化,因此通过反射访问它们需要一些试验和错误(显然是测试(。