Spec-Zone.ru › OpenJDK 27

Класс 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
Модификатор и тип Метод Описание
boolean equals(Object obj)
Указывает, является ли другой объект «равным» этому объекту.
protected void finalize()
Устарело, будет удалено: этот элемент API подлежит удалению в будущей версии.
Финализация устарела и подлежит удалению в одном из будущих выпусков.
final Class<?> getClass()
Возвращает класс времени выполнения для этого Object.
int hashCode()
Возвращает значение хеш-кода этого объекта.
final void notify()
Пробуждает один поток, ожидающий на мониторе этого объекта.
final void notifyAll()
Пробуждает все потоки, ожидающие на мониторе этого объекта.
String toString()
Возвращает строковое представление объекта.
final void wait()
Заставляет текущий поток ожидать пробуждения, обычно в результате уведомления или прерывания.
final void wait(long timeoutMillis)
Заставляет текущий поток ожидать пробуждения, обычно в результате уведомления или прерывания, либо до истечения определённого промежутка реального времени.
final void wait(long timeoutMillis, int nanos)
Заставляет текущий поток ожидать пробуждения, обычно в результате уведомления или прерывания, либо до истечения определённого промежутка реального времени.

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

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, 2026, 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.

Spec-Zone.ru

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