Ссылка на класс<T>

Прямые известные подклассы:
PhantomReference, SoftReference, WeakReference
public abstract class Reference<T>
extends Object

Абстрактный базовый класс для объектов ссылок. Этот класс определяет операции, общие для всех объектов ссылок. Поскольку объекты ссылок реализуются в тесном сотрудничестве с сборщиком мусора, этот класс напрямую подклассировать нельзя.

С момента:
1.2

Методы

Модификатор и тип Метод Описание
void clear()

Очищает этот объект ссылки.

protected Object clone()

Выбрасывает CloneNotSupportedException.

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

Spec-Zone .ru
спецификации, руководства, описания, API