Как получить экземпляр внешнего класса с экземпляром внутреннего класса в Java

В книге " Параллелизм Java на практике", когда речь идет о способах публикации объекта, существует механизм публикации экземпляра внутреннего класса, и он небезопасен, поскольку

экземпляры внутреннего класса содержат скрытую ссылку на включающий экземпляр

Мне было интересно, почему это небезопасно, если вы не можете получить экземпляр внешнего класса через экземпляр внутреннего класса, просто потому, что это повлияет на сборщик мусора? Я запутался, есть ли способ получить экземпляр внешнего класса, как отражение?

1 ответ

Это не повлияет на GC, как вы думаете. JVM использует анализ достижимости, а не автоматический подсчет ссылок, поэтому оба могут быть освобождены, когда ни один из них не доступен из начального граф объекта объекта.

Это небезопасно - я предполагаю, что они подразумевали публикацию как сериализацию и отправку, потому что посредством ссылки внешний экземпляр также будет сериализован, вызывая большее сообщение и / или исключение сериализации (в случае, если он содержит что-то не транзитный, не сериализуемый элемент или сам не сериализуемо).

Я не уверен, что имя ссылки на внешний объект стандартизировано каким-либо образом, поэтому доступ к ним с помощью рефлексии требует некоторых проб и ошибок (и, очевидно, тестирования).

Другие вопросы по тегам