Ссылка на класс<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 вместо этого.- Переопределяет:
-
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://download.java.net/java/early_access/jdk24/docs/api/java.base/java/lang/ref/Reference.html