Ссылка на класс<T>
- Прямые известные подклассы:
-
PhantomReference,SoftReference,WeakReference
public abstract class Reference<T> extends Object
- С:
- 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 не может быть клонирован осмысленно. Создайте новый объект Reference вместо этого.- Overrides:
-
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, этот метод не оказывает никакого влияния. - См. Спецификацию языка Java:
- 12.6 Финализация экземпляров классов
- С тех пор:
- 9
© 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/Reference.html