Класс Reference<T>
- Параметры типа:
T- тип референта
- Прямые известные подклассы:
PhantomReference, SoftReference, WeakReference
public abstract sealed class Reference<T> extends Object permits PhantomReference<T>, SoftReference<T>, WeakReference<T> (not exhaustive)
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
void |
clear() |
Очищает этот объект-ссылку. |
protected Object |
clone() |
Выбрасывает исключение CloneNotSupportedException. |
boolean |
enqueue() |
Очищает этот объект-ссылку, а затем пытается добавить его в очередь, с которой он зарегистрирован, если такая есть. |
T |
get() |
Возвращает референт этого объекта-ссылки. |
boolean |
isEnqueued() |
Устарело. Изначально этот метод предназначался для проверки того, был ли объект-ссылка очищен и помещён в очередь, но проверка никогда не была реализована. |
static void |
reachabilityFence |
Гарантирует, что данный объект остаётся сильно достижимым. |
final boolean |
refersTo |
Проверяет, является ли референт этого объекта-ссылки obj. |
Методы, объявленные в классе Object
equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait | Модификатор и тип | Метод | Описание |
|---|---|---|
boolean |
equals |
Указывает, является ли другой объект «равным» этому объекту. |
protected void |
finalize() |
Устарело, будет удалено: этот элемент API подлежит удалению в будущей версии. Финализация устарела и подлежит удалению в одном из будущих выпусков. |
final Class |
getClass() |
Возвращает класс времени выполнения для этого Object. |
int |
hashCode() |
Возвращает значение хеш-кода этого объекта. |
final void |
notify() |
Пробуждает один поток, ожидающий на мониторе этого объекта. |
final void |
notifyAll() |
Пробуждает все потоки, ожидающие на мониторе этого объекта. |
String |
toString() |
Возвращает строковое представление объекта. |
final void |
wait() |
Заставляет текущий поток ожидать пробуждения, обычно в результате уведомления или прерывания. |
final void |
wait |
Заставляет текущий поток ожидать пробуждения, обычно в результате уведомления или прерывания, либо до истечения определённого промежутка реального времени. |
final void |
wait |
Заставляет текущий поток ожидать пробуждения, обычно в результате уведомления или прерывания, либо до истечения определённого промежутка реального времени. |
Подробное описание методов
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()
Когда сборщик мусора или метод enqueue() очищает ссылки, это выполняется напрямую, без вызова данного метода.
- Примечание к API:
- Существует вероятность гонки с сборщиком мусора. В момент вызова этого метода сборщик мусора уже может выполнять (или уже завершить) очистку и/или помещение этой ссылки в очередь. Чтобы избежать этой гонки, обеспечьте сильную достижимость референта до завершения вызова clear(), при необходимости используя
reachabilityFence(Object).
isEnqueued
@Deprecated(since="16") public boolean isEnqueued()
ReferenceQueue. Приложение, полагающееся на этот метод для освобождения критически важных ресурсов, может вызвать серьёзное снижение производительности. Для надёжного определения того, какие объекты-ссылки были помещены в очередь, приложению следует использовать ReferenceQueue, а для определения того, был ли этот объект-ссылка очищен, — refersTo(null).true только при выполнении всех следующих условий: - этот объект-ссылка был зарегистрирован в очереди при создании; и
- сборщик мусора добавил этот объект-ссылку в очередь или вызван метод
enqueue(); и - этот объект-ссылка ещё не удалён из очереди.
false. Этот метод может вернуть false, если этот объект-ссылка был очищен, но не помещён в очередь из-за состояния гонки.- Возвращает:
-
trueтогда и только тогда, когда этот объект-ссылка находится в связанной с ним очереди (если таковая имеется).
enqueue
public boolean enqueue()
Если эта ссылка зарегистрирована в очереди, но ещё не помещена в неё, ссылка добавляется в очередь; метод выполняется успешно и возвращает true. Если эта ссылка не зарегистрирована в очереди или уже была помещена в неё (сборщиком мусора или предыдущим вызовом enqueue), метод выполняется безуспешно и возвращает false.
Эффекты согласованности памяти: действия в потоке, предшествующие успешному вызову enqueue, происходят до удаления ссылки из очереди методом ReferenceQueue.poll() или ReferenceQueue.remove(long). Для безуспешных вызовов enqueue эффекты согласованности памяти не определены.
При очистке ссылок этот метод выполняет очистку напрямую, не вызывая метод clear(). Когда сборщик мусора очищает и помещает ссылки в очередь, он выполняет эти действия напрямую, не вызывая метод clear() или данный метод.
- Примечание к API:
- Использование этого метода позволяет методам
ReferenceQueue.poll()иReferenceQueue.remove(long)зарегистрированной очереди возвращать эту ссылку, даже если её референт всё ещё может быть сильно достижим. - Возвращает:
-
true, если этот объект-ссылка был успешно помещён в очередь;false, если он уже был помещён в очередь или не был зарегистрирован в очереди при создании
clone
protected Object clone() throws CloneNotSupportedException
CloneNotSupportedException. Reference нельзя осмысленно клонировать. Вместо этого создайте новый Reference.- Переопределяет:
-
cloneв классеObject - Возвращает:
- обычно не возвращает
- Выбрасывает:
-
CloneNotSupportedException— всегда - См. также:
reachabilityFence
public static void reachabilityFence(Object ref)
Этот метод задаёт порядок для сильной достижимости относительно сборки мусора. Он управляет отношениями, которые в противном случае неявно задаются в программе, — условиями достижимости, запускающими сборку мусора. Этот метод применим только в тех случаях, когда освобождение может иметь видимые последствия, например для объектов, использующих финализаторы или Cleaner, либо для кода, выполняющего обработку ссылок.
Эффекты согласованности памяти: действия в потоке до вызова reachabilityFence(x) происходят до очистки сборщиком мусора любой ссылки на x.
- Примечание к API:
- Обработка ссылок или финализация может происходить после того, как объект становится недостижимым. Объект может стать недостижимым, когда виртуальная машина определяет, что он больше не нужен (за исключением выполнения финализатора). При оптимизации виртуальная машина может переупорядочивать операции методов объекта таким образом, что объект становится ненужным раньше, чем можно было бы ожидать, — в том числе во время выполнения метода этого объекта. Например, виртуальная машина может перенести загрузку значений из полей объекта на более ранний момент. Сам объект после этого больше не нужен и становится недостижимым, а метод может продолжить выполнение, используя полученные значения. При использовании Cleaner или финализатора для очистки это может привести к неожиданным и нежелательным последствиям: возникает гонка между потоком программы, выполняющим метод, и потоком очистки, выполняющим Cleaner или финализатор. Поток очистки может освободить ресурс, после чего поток программы (всё ещё выполняющий метод) попытается обратиться к уже освобождённому ресурсу. Использование
reachabilityFenceпозволяет предотвратить эту гонку, гарантируя, что объект остаётся сильно достижимым.Ниже приведён пример, в котором учётные данные класса хранятся с помощью индексов массива. В этом примере метод
actionиспользуетreachabilityFence, чтобы объектResourceне был освобождён до завершения учёта связанного с нимExternalResource; в частности, чтобы слот массива, содержащийExternalResource, не был обнулён в методеObject.finalize(), который в противном случае может выполняться параллельно.Вызовclass Resource { private static ExternalResource[] externalResourceArray = ... int myIndex; Resource(...) { this.myIndex = ... externalResourceArray[myIndex] = ...; ... } protected void finalize() { externalResourceArray[this.myIndex] = null; ... } public void action() { try { // ... int i = this.myIndex; // last use of 'this' Resource in action() 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не требуется в конструкциях, которые сами обеспечивают достижимость. Например, поскольку заблокированные объекты, как правило, нельзя освободить, было бы достаточно заключить все обращения к объекту во всех методах классаResource(включаяfinalize) в блокиsynchronized (this). (Кроме того, такие блоки не должны содержать бесконечных циклов или сами быть недостижимыми — это исключения из оговорки «как правило».) Однако методreachabilityFenceостаётся предпочтительным вариантом в случаях, когда синхронизация не столь эффективна, желательна или возможна, например если она может привести к взаимной блокировке. - Параметры:
-
ref— ссылка на объект, который необходимо сохранить сильно достижимым. Еслиnull, метод ничего не делает. - Начиная с:
- 9
© 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.