Class 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. |
Подробное описание методов
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.
https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/lang/ref/Reference.html