Пакет java.lang.ref
Спецификация пакета
Объект-ссылка инкапсулирует ссылку на некоторый другой объект таким образом, что сама ссылка может быть просмотрена и обработана как любой другой объект. Предоставляются три типа объектов-ссылок, каждый из которых слабее предыдущего: мягкие, слабые и фантомные. Каждый тип соответствует различной степени достижимости, как определено ниже. Мягкие ссылки предназначены для реализации кэшей, чувствительных к памяти, слабые ссылки предназначены для реализации канонизирующих отображений, которые не препятствуют тому, чтобы их ключи (или значения) были удалены, а фантомные ссылки предназначены для планирования действий по очистке посмертно. Действия по очистке посмертно могут быть зарегистрированы и управляютсяCleaner. Каждый тип объектов-ссылок реализован подклассом абстрактного базового класса Reference. Экземпляр одного из этих подклассов инкапсулирует единственную ссылку на конкретный объект, называемый ссылочной сущностью. Каждый объект ссылки предоставляет методы для получения и очистки ссылки. Помимо операции очистки, объекты-ссылки являются неизменяемыми, поэтому никакая set операция не предоставляется. Программа может дополнительно создать подклассы этих подклассов, добавляя необходимые поля и методы, или она может использовать эти подклассы без изменений.
Уведомление
Программа может запросить уведомление об изменениях в достижимости объекта, зарегистрировав соответствующий объект ссылки в очереди ссылок в момент создания объекта ссылки. Через некоторое время после того, как сборщик мусора определит, что достижимость объекта-ссылочной сущности изменилась на значение, соответствующее типу ссылки, он очистит ссылку и добавит её в связанную очередь. В этот момент ссылка считается зарегистрированной в очереди. Программа может извлекать ссылки из очереди либо путём опроса, либо путём блокирования до тех пор, пока ссылка не станет доступной. Очереди ссылок реализуются классомReferenceQueue. Связь между зарегистрированным объектом ссылки и его очередью односторонняя. То есть очередь не отслеживает ссылки, зарегистрированные в ней. Если зарегистрированная ссылка сама становится недоступной, то она никогда не будет зарегистрирована в очереди. Программа, использующая объекты ссылки, несёт ответственность за обеспечение того, чтобы объекты оставались доступными до тех пор, пока программа заинтересована в их объектах-ссылочных сущностях.
Хотя некоторые программы выберут для себя задачу выделения потока для удаления объектов-ссылок из одной или нескольких очередей и их обработки, это совершенно необязательно. Часто хорошо работает тактика проверки очереди ссылок в ходе выполнения некоторого другого достаточно частого действия. Например, хеш-таблица, которая использует слабые ссылки для реализации слабых ключей, может опрашивать свою очередь ссылок каждый раз, когда к таблице осуществляется доступ. Так работает класс WeakHashMap. Поскольку метод ReferenceQueue.poll просто проверяет внутреннюю структуру данных, эта проверка добавит небольшую нагрузку к методам доступа к хеш-таблице.
Достижимость
От наибольшей к наименьшей, различные уровни достижимости отражают жизненный цикл объекта. Они операционно определяются следующим образом:- Объект считается сильно достижимым, если к нему можно обратиться из некоторого потока без прохождения через какие-либо объекты-ссылки. Недавно созданный объект сильно достижим для потока, который его создал.
- Объект считается мягко достижимым, если он не является сильно достижимым, но к нему можно обратиться, пройдя через мягкую ссылку.
- Объект считается слабо достижимым, если он не является ни сильно, ни мягко достижимым, но к нему можно обратиться, пройдя через слабую ссылку. Когда слабые ссылки на слабо достижимый объект очищаются, объект становится готовым к финализации.
- Объект считается фантомно достижимым, если он не является ни сильно, ни мягко, ни слабо достижимым, он был финализирован, и на него указывает какая-то фантомная ссылка.
- Наконец, объект считается недостижимым и, следовательно, готовым к освобождению, когда он не достижим ни одним из вышеперечисленных способов.
- Since:
- 1.2
| Класс | Описание |
|---|---|
| Cleaner | Cleaner управляет набором ссылок на объекты и соответствующими действиями очистки. |
| Cleaner.Cleanable | Cleanable представляет собой объект и действие очистки, зарегистрированные в Cleaner. |
| PhantomReference<T> | Фантомные объекты-ссылки, которые регистрируются в очереди после того, как сборщик мусора определит, что их referents могут быть удалены. |
| Reference<T> | Абстрактный базовый класс для объектов-ссылок. |
| ReferenceQueue<T> | Очереди ссылок, в которые зарегистрированные объекты-ссылки добавляются сборщиком мусора после обнаружения соответствующих изменений в достижимости. |
| SoftReference<T> | Мягкие объекты-ссылки, которые очищаются по усмотрению сборщика мусора в ответ на потребность в памяти. |
| WeakReference<T> | Слабые объекты-ссылки, которые не препятствуют тому, чтобы их referents были финализированы, завершены и затем удалены. |
© 1993, 2021, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/ref/package-summary.html