Spec-Zone.ru › OpenJDK 24

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

Когда сборщик мусора или метод 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 вместо этого.
Переопределяет:
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

© 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://download.java.net/java/early_access/jdk24/docs/api/java.base/java/lang/ref/Reference.html

Spec-Zone.ru

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