Ссылка на класс<T>
- Параметры типа:
-
T- тип ссылаемого объекта
- Непосредственные известные подклассы:
-
PhantomReference,SoftReference,WeakReference
public abstract sealed class Reference<T> extends Object permits PhantomReference<T>, SoftReference<T>, WeakReference<T> (not exhaustive)
- Диаграмма графа иерархии запечатанного класса:
- С:
- 1.2
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
void |
clear() |
Очищает этот объект ссылки. |
protected Object |
clone() |
Выбрасывает CloneNotSupportedException. |
boolean |
enqueue() |
Очищает этот объект ссылки и добавляет его в очередь, с которой он зарегистрирован, если таковая имеется. |
T |
get() |
Возвращает ссылаемый объект этого объекта ссылки. |
boolean |
isEnqueued() |
Устарело. Этот метод изначально был предназначен для проверки, был ли объект ссылки очищен и помещён в очередь, но никогда не был реализован для выполнения этого теста. |
static void |
reachabilityFence |
Обеспечивает, что объект, на который ссылается данный объект ссылки, остаётся жёстко связанным, независимо от любых предыдущих действий программы, которые могли бы в противном случае привести к тому, что объект станет недоступным; таким образом, ссылаемый объект не может быть удалён сборщиком мусора по крайней мере до тех пор, пока не будет выполнен вызов этого метода. |
final boolean |
refersTo |
Проверяет, является ли ссылаемый объект этого объекта ссылки obj. |
Подробное описание методов
get
public T get()
null.- Прим. API:
- Этот метод возвращает сильную ссылку на объект-ссылочное значение. Это может заставить сборщик мусора обращаться к нему как к сильно достижимому до некоторого последующего цикла сбора. Метод
refersToможно использовать, чтобы избежать такого усиления при проверке, является ли какой-либо объект объектом-ссылочным значением; то есть, используйтеref.refersTo(obj)вместоref.get() == obj. - Возвращает:
- Объект, на который ссылается эта ссылка, или
null, если эта ссылка была очищена - См. также:
refersTo
public final boolean refersTo(T obj)
obj. Использование null obj возвращает true, если ссылка была очищена.- Параметры:
-
obj- объект для сравнения с объектом-ссылочным значением этой ссылки - Возвращает:
-
trueеслиobjявляется объектом-ссылочным значением этой ссылки - С тех пор:
- 16
clear
public void clear()
Этот метод вызывается только кодом Java; когда сборщик мусора очищает ссылки, он делает это непосредственно, не вызывая этот метод.
isEnqueued
@Deprecated(since="16") public boolean isEnqueued()
ReferenceQueue. Приложение, которое полагается на этот метод для освобождения критических ресурсов, может вызвать серьезные проблемы с производительностью. Приложение должно использовать ReferenceQueue для надежного определения ссылок, которые были помещены в очередь, или refersTo(null), чтобы определить, была ли эта ссылка очищена.true только если выполняются все следующие условия: - эта ссылка была зарегистрирована в очереди при ее создании; и
- сборщик мусора добавил эту ссылку в очередь или
enqueue()был вызван; и - эта ссылка еще не удалена из очереди.
false. Этот метод может вернуть false если эта ссылка была очищена, но не помещена в очередь из-за гонки условий.- Возвращает:
-
trueтогда и только тогда, когда эта ссылка находится в связанной очереди (если таковая имеется).
enqueue
public boolean enqueue()
Этот метод вызывается только кодом Java; когда сборщик мусора помещает ссылки в очередь, он делает это непосредственно, не вызывая этот метод.
- Возвращает:
-
trueесли эта ссылка была успешно помещена в очередь;falseесли она уже была в очереди или если она не была зарегистрирована в очереди при ее создании
clone
protected Object clone() throws CloneNotSupportedException
CloneNotSupportedException. Ссылку нельзя клонировать. Создайте новую Reference вместо этого.- Переопределяет:
-
cloneв классеObject - Возвращает:
- никогда не возвращает значение нормально
- Бросает:
-
CloneNotSupportedException- всегда - С тех пор:
- 11
- См. также:
reachabilityFence
public static void reachabilityFence(Object ref)
Этот метод устанавливает порядок для сильной достижимости относительно сборки мусора. Он управляет отношениями, которые в противном случае явны в программе — условиями достижимости, которые инициируют сборку мусора. Этот метод предназначен для использования в редких случаях преждевременного завершения работы, когда использование synchronized блоков или методов, или использование других средств синхронизации невозможно или не обеспечивает желаемый контроль. Этот метод применим только в тех случаях, когда удаление может иметь видимые эффекты, что возможно для объектов с финализаторами (см. раздел 12.6 спецификации языка Java), реализованных способами, которые полагаются на управление порядком для правильности.
- Прим. API:
- Завершение работы может произойти всякий раз, когда виртуальная машина обнаруживает, что ни одна ссылка на объект никогда не будет сохранена в куче: сборщик мусора может освободить объект, даже если поля этого объекта по-прежнему используются, если объект в противном случае стал недоступным. Это может иметь неожиданные и нежелательные последствия в таких случаях, как, например, пример, в котором ведение учета связанного класса выполняется с помощью индексов массива. Здесь метод
actionиспользуетreachabilityFenceдля обеспечения того, что объектResourceне будет освобожден до того, как будет выполнен учет по связанномуExternalResource; в частности, здесь, чтобы убедиться, что ячейка массива, содержащаяExternalResource, не сброшена в методеObject.finalize(), который в противном случае может выполняться параллельно.
Здесь вызовclass Resource { private static ExternalResource[] externalResourceArray = ... int myIndex; Resource(...) { myIndex = ... externalResourceArray[myIndex] = ...; ... } protected void finalize() { externalResourceArray[myIndex] = null; ... } public void action() { try { // ... int i = myIndex; Resource.update(externalResourceArray[i]); } finally { Reference.reachabilityFence(this); } } private static void update(ExternalResource ext) { ext.status = ...; } }reachabilityFenceне интуитивно размещается *после* вызоваupdate, чтобы убедиться, что ячейка массива не сброшена методомObject.finalize()до обновления, даже если вызовactionбыл последним использованием этого объекта. Это может быть так, например, если использование в программе пользователя имело видnew Resource().action();, который не сохраняет ни одной другой ссылки на этот объектResource. Хотя, вероятно, излишне,reachabilityFenceпомещается в блокfinallyдля обеспечения того, что он будет вызван по всем путям в методе. В методе с более сложными путями управления вам могут потребоваться дополнительные меры предосторожности для обеспечения того, чтоreachabilityFenceвстречается по всем путям.Иногда возможно лучше инкапсулировать использование
reachabilityFence. Продолжая приведенный выше пример, если вызов методаupdateможно было бы пропустить, даже если финализатор уже был выполнен (сбросив ячейку), то вы могли бы локализовать использованиеreachabilityFence:public void action2() { // ... Resource.update(getExternalResource()); } private ExternalResource getExternalResource() { ExternalResource ext = externalResourceArray[myIndex]; Reference.reachabilityFence(this); return ext; }Метод
reachabilityFenceне требуется в конструкциях, которые сами по себе обеспечивают достижимость. Например, поскольку объекты, которые заблокированы, как правило, не могут быть освобождены, достаточно, если все обращения к объекту во всех методах классаResource(включаяfinalize) были заключены в блокиsynchronized (this). (Кроме того, такие блоки не должны содержать бесконечных циклов или сами по себе быть недостижимыми, что попадает в исключения к заявлению «в общем случае»). Однако, методreachabilityFenceостается лучшим вариантом в тех случаях, когда этот подход не является таким эффективным, желательным или возможным; например, потому что он может столкнуться с тупиковой ситуацией. - Параметры:
-
ref- ссылка. Еслиnull, этот метод не оказывает никакого эффекта. - С тех пор:
- 9
© 1993, 2023, 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/21/docs/api/java.base/java/lang/ref/Reference.html