Ссылка на класс<T>
- java.lang.Object
-
- java.lang.ref.Reference<T>
- Прямые известные подклассы:
-
PhantomReference,SoftReference,WeakReference
public abstract class Reference<T> extends Object
Абстрактный базовый класс для объектов ссылок. Этот класс определяет операции, общие для всех объектов ссылок. Поскольку объекты ссылок реализуются в тесном сотрудничестве с сборщиком мусора, этот класс напрямую подклассировать нельзя.
- С момента:
- 1.2
Методы
| Модификатор и тип | Метод | Описание |
|---|---|---|
void |
clear() |
Очищает этот объект ссылки. |
protected Object |
clone() |
Выбрасывает |
boolean |
enqueue() |
Очищает этот объект ссылки и добавляет его в очередь, с которой он зарегистрирован, если таковая имеется. |
T |
get() |
Возвращает ссылку на referent этого объекта ссылки. |
boolean |
isEnqueued() |
Указывает, был ли этот объект ссылки помещён в очередь, либо программой, либо сборщиком мусора. |
static void |
reachabilityFence(Object ref) |
Обеспечивает, чтобы объект, на который ссылается заданная ссылка, оставался сильно достижимым, независимо от каких-либо предыдущих действий программы, которые могли бы привести к тому, что объект станет недостижимым; таким образом, объект-ссылка не подлежит освобождению сборщиком мусора, по крайней мере, до вызова этого метода. |
Методы, объявленные в классе java.lang.Object
equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
Методы
get
public T get()
Возвращает ссылку на referent этого объекта ссылки. Если этот объект ссылки был очищен, либо программой, либо сборщиком мусора, то этот метод возвращает null.
- Возвращает:
- Объект, на который ссылается эта ссылка, или
null, если этот объект ссылки был очищен
clear
public void clear()
Очищает этот объект ссылки. Вызов этого метода не приведет к добавлению этого объекта в очередь.
Этот метод вызывается только кодом Java; когда сборщик мусора очищает ссылки, он делает это непосредственно, не вызывая этот метод.
isEnqueued
public boolean isEnqueued()
Указывает, был ли этот объект ссылки помещён в очередь, либо программой, либо сборщиком мусора. Если этот объект ссылки не был зарегистрирован в очереди при его создании, то этот метод всегда вернёт false.
- Возвращает:
-
trueтогда и только тогда, когда этот объект ссылки был помещён в очередь
enqueue
public boolean enqueue()
Очищает этот объект ссылки и добавляет его в очередь, с которой он зарегистрирован, если таковая имеется.
Этот метод вызывается только кодом Java; когда сборщик мусора помещает ссылки в очередь, он делает это непосредственно, не вызывая этот метод.
- Возвращает:
-
trueесли этот объект ссылки успешно помещен в очередь;falseесли он уже был помещён в очередь или если он не был зарегистрирован в очереди при его создании
clone
protected Object clone()
throws CloneNotSupportedException
Выбрасывает CloneNotSupportedException. Объект Reference нельзя клонировать. Создайте новый Reference вместо этого.
- Переопределяет:
-
cloneв классеObject - Возвращает:
- клон этого экземпляра.
- Выбрасывает:
-
CloneNotSupportedException- всегда - С момента:
- 11
- См. также:
Cloneable
reachabilityFence
public static void reachabilityFence(Object ref)
Обеспечивает, чтобы объект, на который ссылается данная ссылка, оставался сильно достижимым, независимо от каких-либо предыдущих действий программы, которые могли бы привести к тому, что объект станет недостижимым; таким образом, объект не подлежит освобождению сборщиком мусора, по крайней мере, до вызова этого метода. Вызов этого метода сам по себе не запускает сборку мусора или окончание работы.
Этот метод устанавливает порядок для сильной достижимости относительно сборки мусора. Он контролирует отношения, которые в противном случае являются только неявными в программе - условия достижимости, запускающие сборку мусора. Этот метод предназначен для использования в необычных ситуациях преждевременного завершения, когда использование synchronized блоков или методов, или использование других синхронизирующих средств невозможны или не обеспечивают желаемого контроля. Этот метод применим только тогда, когда освобождение может иметь видимые эффекты, что возможно для объектов с финализаторами (см. Раздел 12.6 17 спецификации языка 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, 2020, 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/11/docs/api/java.base/java/lang/ref/Reference.html