Spec-Zone.ru › OpenJDK 25

Class Reference<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.

Методы, объявленные в классе 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()
Очищает этот объект-ссылку. Вызов этого метода не ставит объект в очередь, а сборщик мусора не будет очищать или ставить его в очередь.

Когда сборщик мусора или метод 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 нельзя осмысленно клонировать. Вместо этого создайте новый Reference.
Переопределяет:
clone в классе Object
Возвращает:
нормально не возвращает управление
Выбрасывает:
CloneNotSupportedException - всегда
См. также:
  • Cloneable

reachabilityFence

public static void reachabilityFence(Object ref)
Гарантирует, что указанный объект останется сильно достижимым. Эта достижимость гарантируется независимо от любых оптимизирующих преобразований, которые может выполнять виртуальная машина и которые иначе могли бы привести к тому, что объект станет недостижимым (см. JLS 12.6.1). Таким образом, сборщик мусора не сможет освободить указанный объект как минимум до завершения вызова этого метода. Ссылки на указанный объект не будут очищены (или поставлены в очередь, если применимо) сборщиком мусора до завершения вызова этого метода. Сам по себе вызов этого метода не запускает обработку ссылок, сборку мусора или финализацию.

Этот метод задаёт порядок сильной достижимости относительно сборки мусора. Он регулирует отношения, которые в противном случае остаются неявными в программе, — условия достижимости, запускающие сборку мусора. Этот метод применим только в случаях, когда освобождение может иметь видимые последствия, например для объектов, использующих финализаторы или 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

Сообщить об ошибке или предложить улучшение
Дополнительную справочную информацию по API и документацию для разработчиков см. в разделе Документация Java SE, содержащем более подробные описания для разработчиков, обзоры концепций, определения терминов, обходные решения и работающие примеры кода. Другие версии.
Java является товарным знаком или зарегистрированным товарным знаком Oracle и/или её дочерних компаний в США и других странах.
Авторское право © 1993, 2025, Oracle и/или её дочерние компании, 500 Oracle Parkway, Redwood Shores, CA 94065 USA.
Все права защищены. Использование регулируется условиями лицензии и политикой распространения документации.

© 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://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/lang/ref/Reference.html

Spec-Zone.ru

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