Пакет java.lang.ref
Объекты-ссылки
Объект-ссылка encapsulates ссылку на другой объект, чтобы сама ссылка могла быть проверена и изменена как любой другой объект. Предоставляются три типа объектов-ссылок, каждый из которых слабее предыдущего: мягкие, слабые и фантомные. Каждый тип соответствует разному уровню достижимости, как определено ниже. Мягкие ссылки предназначены для реализации кэшей, чувствительных к памяти; слабые ссылки — для реализации канонизирующих отображений, которые не препятствуют удалению их ключей (или значений); фантомные ссылки — для планирования действий по очистке после смерти объекта. Действия по очистке после смерти также могут быть зарегистрированы и управляемыCleaner. Каждый тип объектов-ссылок реализуется подклассом абстрактного базового класса Reference. Экземпляр одного из этих подклассов encapsulates единственную ссылку на конкретный объект, называемый referent. Каждый объект-ссылка предоставляет методы для получения и удаления ссылки. Помимо операции удаления, объекты-ссылки неизменны, поэтому предоставлена ни одна set операция. Программа может дополнительно создать подклассы этих подклассов, добавив необходимые поля и методы, или может использовать эти подклассы без изменений.
Достижимость
Достижимый объект — это любой объект, к которому можно получить доступ в любом потенциальном продолжении вычисления от любого активного потока (как указано в JLS 12.6.1).От самого сильного к самому слабому, разные уровни достижимости отражают жизненный цикл объекта. Они операционально определены следующим образом:
- Объект является строго достижимым, если он достижим и если к нему можно получить доступ без перехода через referent объекта-ссылки.
- Объект является мягко достижимым, если он не строго достижим, но к нему можно получить доступ, перейдя по мягкой ссылке.
- Объект является слабо достижимым, если он не строго и не мягко достижим, но к нему можно получить доступ, перейдя по слабой ссылке. Когда слабые ссылки на слабо достижимый объект удаляются, объект становится пригодным для окончательной обработки.
- Объект является фантомно достижимым, если он не строго, не мягко и не слабо достижим, он был окончательно обработан, и на него ссылается какая-то фантомная ссылка.
- Наконец, объект является недоступным и, следовательно, пригодным для освобождения, когда он недостижим ни одним из вышеперечисленных способов.
Уведомление
Программа может запросить уведомление о изменениях в достижимости объекта, зарегистрировав соответствующий объект ссылки с помощьюReferenceQueue. Это делается путем предоставления очереди ссылок в качестве аргумента конструктора при создании объекта-ссылки. Через некоторое время после того, как сборщик мусора определит, что достижимость referent изменилась в соответствии с типом ссылки, он удалит ссылку и добавит её в ассоциированную очередь. В этот момент ссылка считается записанной в очередь. Программа узнает об изменении достижимости referent, когда соответствующая ссылка станет доступна в очереди. Программа может удалять ссылки из очереди (то есть выдавать их из очереди) с помощью методов ReferenceQueue.poll() или ReferenceQueue.remove(). Дополнительные данные, необходимые для ответа на изменение достижимости referent, могут быть сохранены в полях пользовательского подкласса ссылки и доступны при возвращении ссылки из очереди. Связь между зарегистрированным объектом-ссылкой и его очередью односторонняя. То есть, очередь не отслеживает ссылки, которые с ней зарегистрированы. Если зарегистрированная ссылка сама становится недостижимой, то она никогда не будет записана в очередь. Программа отвечает за обеспечение того, чтобы объекты-ссылки оставались доступными до тех пор, пока программа заинтересована в их referent.
Хотя некоторые программы предпочтут посвятить поток удалению объектов-ссылок из одной или нескольких очередей и их обработке, это никоим образом не обязательно. Тактика, которая часто работает хорошо, заключается в проверке очереди ссылок в ходе выполнения какой-либо другой довольно частой операции. Например, хеш-таблица, использующая слабые ссылки для реализации слабых ключей, может опросить свою очередь ссылок каждый раз, когда к таблице обращаются. Так работает класс WeakHashMap. Поскольку метод ReferenceQueue.poll просто проверяет внутреннюю структуру данных, эта проверка добавит небольшую нагрузку к методам доступа к хеш-таблице.
Свойства согласованности памяти
Некоторые взаимодействия между ссылками, очередями ссылок и сборщиком мусора образуют отношения happens-before:- Действия в потоке до вызова
Reference.reachabilityFence(x)happens-before удаления сборщиком мусора любой ссылки наx. - Удаление ссылки сборщиком мусора happens-before запись ссылки в очередь сборщиком мусора.
- Запись ссылки в очередь (сборщиком мусора или успешным вызовом
Reference.enqueue()) happens-before извлечение ссылки из очереди (выдача из очереди). - Выдача ссылки на зарегистрированный объект потоком Cleaner happens-before запуск потоком Cleaner действия очистки для этого объекта.
Reference.reachabilityFence(x) happens-before код очистки для x выполняется в потоке Cleaner. В частности, изменения состояния x, произведённые до reachabilityFence(x), будут видны коду очистки, выполняющемуся в потоке Cleaner, без дополнительной синхронизации. См. JLS 17.4.5. Взаимодействие между ссылками, финализаторами и сборщиком мусора также образует отношение happens-before:
- Действия в потоке до вызова
Reference.reachabilityFence(x)happens-before выполнение финализатора дляxпотоком финализатора.
Reference.reachabilityFence(x) happens-before код очистки для x выполняется в потоке финализатора. В частности, изменения состояния x, произведённые до reachabilityFence(x), будут видны коду очистки, выполняющемуся в потоке финализатора, без дополнительной синхронизации. См. JLS 17.4.5.- Since:
- 1.2
| Класс | Описание |
|---|---|
| Cleaner | Cleaner управляет набором ссылок на объекты и соответствующими действиями очистки. |
| Cleaner.Cleanable | Cleanable представляет собой объект и действие очистки, зарегистрированное в Cleaner. |
| PhantomReference<T> | Фантомные объекты ссылок, которые записываются в очередь после того, как сборщик определил, что их referent могут быть удалены. |
| Reference<T> | Абстрактный базовый класс для объектов ссылок. |
| ReferenceQueue<T> | Очереди ссылок, в которые зарегистрированные объекты-ссылки добавляются сборщиком мусора после обнаружения соответствующих изменений достижимости. |
| SoftReference<T> | Мягкие объекты-ссылки, которые удаляются по усмотрению сборщика мусора в ответ на потребность в памяти. |
| WeakReference<T> | Слабые объекты ссылок, которые не препятствуют тому, чтобы их referent были сделаны окончательными, финализированы и затем удалены. |
© 1993, 2025, 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://download.java.net/java/early_access/jdk24/docs/api/java.base/java/lang/ref/package-summary.html