Spec-Zone.ru › OpenJDK 21

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

java.lang.Object
java.lang.ref.Reference<T>
Параметры типа:
T - тип ссылаемого объекта
Непосредственные известные подклассы:
PhantomReference, SoftReference, WeakReference
public abstract sealed class Reference<T> extends Object permits PhantomReference<T>, SoftReference<T>, WeakReference<T> (not exhaustive)
Абстрактный базовый класс для объектов ссылок. Этот класс определяет операции, общие для всех объектов ссылок. Поскольку объекты ссылок реализуются в тесном сотрудничестве с сборщиком мусора, этот класс напрямую нельзя наследовать.
Диаграмма графа иерархии запечатанного класса:
Sealed class hierarchy graph for ReferenceSealed class hierarchy graph for Reference
С:
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 вместо этого.
Переопределяет:
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, этот метод не оказывает никакого эффекта.
С тех пор:
9

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

Spec-Zone.ru

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