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