Spec-Zone.ru › OpenJDK 17

Ссылка на класс<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()
Выбрасывает CloneNotSupportedException.
boolean enqueue()
Очищает этот объект ссылки и добавляет его в очередь, с которой он зарегистрирован, если таковая имеется.
T get()
Возвращает референт этого объекта ссылки.
boolean isEnqueued()
Устарело.
Этот метод был первоначально задан для проверки, был ли объект ссылки очищен и помещён в очередь, но никогда не был реализован для выполнения этого теста.
static void reachabilityFence(Object ref)
Обеспечивает, что объект, на который указывает данная ссылка, остаётся сильно достижимым, независимо от предыдущих действий программы, которые могли бы привести к тому, что объект станет недостижимым; таким образом, на него не может быть обработано обращение сборки мусора по меньшей мере до вызова этого метода.
final boolean refersTo(T obj)
Проверяет, является ли референт этого объекта ссылки obj.

Методы, объявленные в классе java.lang.Object

equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait

Подробное описание методов

get

public T get()
Возвращает ссылку на объект, на который ссылается эта ссылка. Если этот объект ссылки был очищен, либо программой, либо сборщиком мусора, то этот метод возвращает null.
Примечание API:
Этот метод возвращает сильную ссылку на ссылку. Это может привести к тому, что сборщик мусора будет рассматривать её как жёстко достижимую до следующего цикла сбора. Метод refersTo может использоваться для предотвращения такого усиления при проверке, является ли какой-либо объект ссылкой на объект; то есть, используйте ref.refersTo(obj) вместо ref.get() == obj.
Возвращает:
Объект, на который ссылается эта ссылка, или null если объект ссылки был очищен
См. также:
  • refersTo(T)

refersTo

public final boolean refersTo(T obj)
Проверяет, является ли ссылка на объект, на который ссылается этот объект ссылки, obj. Использование null obj возвращает true если объект ссылки был очищен.
Параметры:
obj - объект для сравнения с объектом, на который ссылается этот объект ссылки
Возвращает:
true если obj является объектом, на который ссылается этот объект ссылки
С тех пор:
16

clear

public void clear()
Очищает этот объект ссылки. Вызов этого метода не приведет к добавлению этого объекта в очередь.

Этот метод вызывается только кодом Java; когда сборщик мусора очищает ссылки, он делает это напрямую, не вызывая этот метод.

isEnqueued

@Deprecated(since="16") public boolean isEnqueued()
Устарело.
Этот метод был первоначально предназначен для проверки, был ли объект ссылки очищен и добавлен в очередь, но никогда не был реализован для проведения этой проверки. Этот метод может быть неправильно использован из-за внутренней гонки или без соответствующего ReferenceQueue. Приложение, полагающееся на этот метод для освобождения критических ресурсов, может вызвать серьёзные проблемы с производительностью. Приложение должно использовать ReferenceQueue для надёжного определения объектов ссылки, которые были помещены в очередь, или refersTo(null) для определения, был ли этот объект ссылки очищен.
Проверяет, находится ли этот объект ссылки в связанной очереди (если она есть). Этот метод возвращает true только в том случае, если выполнены все следующие условия:
  • Этот объект ссылки был зарегистрирован в очереди при его создании; и
  • Сборщик мусора добавил этот объект ссылки в очередь или был вызван метод enqueue(); и
  • Этот объект ссылки ещё не удалён из очереди.
В противном случае этот метод возвращает false. Этот метод может вернуть false если этот объект ссылки был очищен, но не добавлен в очередь из-за гонки.
Возвращает:
true только в том случае, если этот объект ссылки находится в связанной очереди (если она есть).

enqueue

public boolean enqueue()
Очищает этот объект ссылки и добавляет его в очередь, с которой он зарегистрирован (если она есть).

Этот метод вызывается только кодом Java; когда сборщик мусора добавляет ссылки в очередь, он делает это напрямую, не вызывая этот метод.

Возвращает:
true если этот объект ссылки был успешно добавлен в очередь; false если он уже был в очереди или не был зарегистрирован в очереди при создании

clone

protected Object clone() throws CloneNotSupportedException
Выбрасывает CloneNotSupportedException. Объект типа Reference не может быть клонирован осмысленно. Создайте новый объект Reference вместо этого.
Overrides:
clone в классе Object
Возвращает:
никогда не возвращается нормально
Выбрасывает:
CloneNotSupportedException - всегда
С тех пор:
11
См. также:
  • Cloneable

reachabilityFence

public static void reachabilityFence(Object ref)
Обеспечивает, чтобы объект, на который ссылается заданная ссылка, оставался жёстко достижимым, независимо от любых предыдущих действий программы, которые могут привести к тому, что объект станет недостижимым; таким образом, объект, на который ссылаются, не может быть возвращен сборщиком мусора по крайней мере до вызова этого метода. Вызов этого метода сам по себе не запускает сборку мусора или окончание.

Этот метод устанавливает порядок жёсткой достижимости относительно сборки мусора. Он управляет отношениями, которые в противном случае являются только неявными в программе - условия достижимости, которые запускают сборку мусора. Этот метод предназначен для использования в редких ситуациях преждевременной финализации, когда использование synchronized блоков или методов, или использование других средств синхронизации не является возможным или не обеспечивает необходимого контроля. Этот метод применим только в тех случаях, когда возвращение может иметь видимые эффекты, что возможно для объектов с финализаторами (см. раздел 12.6 спецификации языка 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, этот метод не оказывает никакого влияния.
См. Спецификацию языка Java:
12.6 Финализация экземпляров классов
С тех пор:
9

© 1993, 2021, 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/17/docs/api/java.base/java/lang/ref/Reference.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API