Spec-Zone.ru › OpenJDK 27

Класс AtomicReferenceFieldUpdater<T,V>

java.lang.Object
java.util.concurrent.atomic.AtomicReferenceFieldUpdater<T,V>
Параметры типа:
T — тип объекта, содержащего обновляемое поле
V — тип поля
public abstract class AtomicReferenceFieldUpdater<T,V> extends Object
Основанная на рефлексии служебная программа, позволяющая атомарно обновлять заданные нестатические поля-ссылки volatile заданных классов и предоставляющая подмножество функциональности класса VarHandle, который следует использовать вместо неё. Этот класс можно использовать в атомарных структурах данных, в которых несколько полей-ссылок одного узла независимо подвергаются атомарным обновлениям. Например, узел дерева может быть объявлен следующим образом:
class Node {
  private volatile Node left, right;

  private static final AtomicReferenceFieldUpdater<Node, Node> leftUpdater =
    AtomicReferenceFieldUpdater.newUpdater(Node.class, Node.class, "left");
  private static final AtomicReferenceFieldUpdater<Node, Node> rightUpdater =
    AtomicReferenceFieldUpdater.newUpdater(Node.class, Node.class, "right");

  Node getLeft() { return left; }
  boolean compareAndSetLeft(Node expect, Node update) {
    return leftUpdater.compareAndSet(this, expect, update);
  }
  // ... and so on
}
Однако предпочтительнее использовать VarHandle:
import java.lang.invoke.VarHandle;
import java.lang.invoke.MethodHandles;
class Node {
 private volatile Node left, right;
 private static final VarHandle LEFT, RIGHT;
 Node getLeft() { return left; }
 boolean compareAndSetLeft(Node expect, Node update) {
   return LEFT.compareAndSet(this, expect, update);
 }
 // ... and so on
 static { try {
   MethodHandles.Lookup l = MethodHandles.lookup();
   LEFT  = l.findVarHandle(Node.class, "left", Node.class);
   RIGHT = l.findVarHandle(Node.class, "right", Node.class);
  } catch (ReflectiveOperationException e) {
    throw new ExceptionInInitializerError(e);
}}}

Обратите внимание, что гарантии метода compareAndSet в этом классе слабее, чем в других атомарных классах. Поскольку этот класс не может гарантировать, что все обращения к полю подходят для атомарного доступа, он гарантирует атомарность только относительно других вызовов compareAndSet и set для того же средства обновления.

Передача в качестве аргументов объектов типа T, которые не являются экземплярами класса, переданного в newUpdater(Class, Class, String), приведёт к выбрасыванию исключения ClassCastException.

С версии:
1.5

Краткое описание конструкторов

AtomicReferenceFieldUpdater()
Модификатор Конструктор Описание
protected
Защищённый конструктор-заглушка для использования подклассами.

Краткое описание методов

Модификатор и тип Метод Описание
final V accumulateAndGet(T obj, V x, BinaryOperator<V> accumulatorFunction)
Атомарно обновляет поле заданного объекта, управляемое этим средством обновления (с эффектами памяти, указанными в VarHandle.compareAndSet(Object...)), результатом применения заданной функции к текущему и заданному значениям и возвращает обновлённое значение.
abstract boolean compareAndSet(T obj, V expect, V update)
Атомарно устанавливает поле заданного объекта, управляемое этим средством обновления, в заданное новое значение, если текущее значение == ожидаемому значению.
abstract V get(T obj)
Возвращает текущее значение поля заданного объекта, управляемого этим средством обновления.
final V getAndAccumulate(T obj, V x, BinaryOperator<V> accumulatorFunction)
Атомарно обновляет поле заданного объекта, управляемое этим средством обновления (с эффектами памяти, указанными в VarHandle.compareAndSet(Object...)), результатом применения заданной функции к текущему и заданному значениям и возвращает предыдущее значение.
V getAndSet(T obj, V newValue)
Атомарно устанавливает поле заданного объекта, управляемое этим средством обновления, в заданное значение и возвращает старое значение.
final V getAndUpdate(T obj, UnaryOperator<V> updateFunction)
Атомарно обновляет поле заданного объекта, управляемое этим средством обновления (с эффектами памяти, указанными в VarHandle.compareAndSet(Object...)), результатом применения заданной функции и возвращает предыдущее значение.
abstract void lazySet(T obj, V newValue)
В конечном итоге устанавливает поле заданного объекта, управляемое этим средством обновления, в заданное новое значение.
static <U,W> AtomicReferenceFieldUpdater<U,W> newUpdater(Class<U> tclass, Class<W> vclass, String fieldName)
Создаёт и возвращает средство обновления для объектов с заданным полем.
abstract void set(T obj, V newValue)
Устанавливает поле заданного объекта, управляемое этим средством обновления, в заданное новое значение.
final V updateAndGet(T obj, UnaryOperator<V> updateFunction)
Атомарно обновляет поле заданного объекта, управляемое этим средством обновления (с эффектами памяти, указанными в VarHandle.compareAndSet(Object...)), результатом применения заданной функции и возвращает обновлённое значение.
abstract boolean weakCompareAndSet(T obj, V expect, V update)
Атомарно устанавливает поле заданного объекта, управляемое этим средством обновления, в заданное новое значение, если текущее значение == ожидаемому значению.

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

clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
Модификатор и тип Метод Описание
protected Object clone()
Создаёт и возвращает копию этого объекта.
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()
Заставляет текущий поток ожидать пробуждения, обычно в результате вызова notify или interrupt.
final void wait(long timeoutMillis)
Заставляет текущий поток ожидать пробуждения, обычно в результате вызова notify или interrupt, либо истечения заданного времени.
final void wait(long timeoutMillis, int nanos)
Заставляет текущий поток ожидать пробуждения, обычно в результате вызова notify или interrupt, либо истечения заданного времени.

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

AtomicReferenceFieldUpdater

protected AtomicReferenceFieldUpdater()
Защищённый конструктор-заглушка для использования подклассами.

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

newUpdater

public static <U,W> AtomicReferenceFieldUpdater<U,W> newUpdater(Class<U> tclass, Class<W> vclass, String fieldName)
Создаёт и возвращает средство обновления для объектов с заданным полем. Аргументы Class необходимы для проверки соответствия типов рефлексии и обобщённых типов.
Параметры типа:
U — тип экземпляров tclass
W — тип экземпляров vclass
Параметры:
tclass — класс объектов, содержащих поле
vclass — класс поля
fieldName — имя обновляемого поля
Возвращает:
средство обновления
Выбрасывает:
ClassCastException — если поле имеет неверный тип
IllegalArgumentException — если поле не является volatile
RuntimeException с вложенным исключением, связанным с рефлексией, если класс не содержит поле или имеет неверный тип, либо если вызывающий код не имеет доступа к полю согласно правилам управления доступом языка Java

compareAndSet

public abstract boolean compareAndSet(T obj, V expect, V update)
Атомарно устанавливает поле заданного объекта, управляемое этим средством обновления, в заданное новое значение, если текущее значение == ожидаемому значению. Этот метод гарантированно атомарен относительно других вызовов compareAndSet и set, но не обязательно относительно других изменений поля.
Параметры:
obj — объект, поле которого нужно условно установить
expect — ожидаемое значение
update — новое значение
Возвращает:
true в случае успеха

weakCompareAndSet

public abstract boolean weakCompareAndSet(T obj, V expect, V update)
Атомарно устанавливает поле заданного объекта, управляемое этим средством обновления, в заданное новое значение, если текущее значение == ожидаемому значению. Этот метод гарантированно атомарен относительно других вызовов compareAndSet и set, но не обязательно относительно других изменений поля.

Эта операция может завершиться неудачей без видимой причины и не предоставляет гарантий упорядочивания, поэтому лишь в редких случаях является подходящей альтернативой compareAndSet.

Параметры:
obj — объект, поле которого нужно условно установить
expect — ожидаемое значение
update — новое значение
Возвращает:
true в случае успеха

set

public abstract void set(T obj, V newValue)
Устанавливает поле заданного объекта, управляемое этим средством обновления, в заданное новое значение. Эта операция гарантированно действует как volatile-запись относительно последующих вызовов compareAndSet.
Параметры:
obj — объект, поле которого нужно установить
newValue — новое значение

lazySet

public abstract void lazySet(T obj, V newValue)
В конечном итоге устанавливает поле заданного объекта, управляемое этим средством обновления, в заданное новое значение.
Параметры:
obj — объект, поле которого нужно установить
newValue — новое значение
С версии:
1.6

get

public abstract V get(T obj)
Возвращает текущее значение поля заданного объекта, управляемого этим средством обновления.
Параметры:
obj — объект, поле которого нужно получить
Возвращает:
текущее значение

getAndSet

public V getAndSet(T obj, V newValue)
Атомарно устанавливает поле заданного объекта, управляемое этим средством обновления, в заданное значение и возвращает старое значение.
Параметры:
obj — объект, поле которого нужно получить и установить
newValue — новое значение
Возвращает:
предыдущее значение

getAndUpdate

public final V getAndUpdate(T obj, UnaryOperator<V> updateFunction)
Атомарно обновляет поле заданного объекта, управляемое этим средством обновления (с эффектами памяти, указанными в VarHandle.compareAndSet(Object...)), результатом применения заданной функции и возвращает предыдущее значение. Функция не должна иметь побочных эффектов, поскольку она может применяться повторно, если попытки обновления завершаются неудачей из-за конкуренции между потоками.
Параметры:
obj — объект, поле которого нужно получить и установить
updateFunction — функция без побочных эффектов
Возвращает:
предыдущее значение
С версии:
1.8

updateAndGet

public final V updateAndGet(T obj, UnaryOperator<V> updateFunction)
Атомарно обновляет поле заданного объекта, управляемое этим средством обновления (с эффектами памяти, указанными в VarHandle.compareAndSet(Object...)), результатом применения заданной функции и возвращает обновлённое значение. Функция не должна иметь побочных эффектов, поскольку она может применяться повторно, если попытки обновления завершаются неудачей из-за конкуренции между потоками.
Параметры:
obj — объект, поле которого нужно получить и установить
updateFunction — функция без побочных эффектов
Возвращает:
обновлённое значение
С версии:
1.8

getAndAccumulate

public final V getAndAccumulate(T obj, V x, BinaryOperator<V> accumulatorFunction)
Атомарно обновляет поле заданного объекта, управляемое этим средством обновления (с эффектами памяти, указанными в VarHandle.compareAndSet(Object...)), результатом применения заданной функции к текущему и заданному значениям и возвращает предыдущее значение. Функция не должна иметь побочных эффектов, поскольку она может применяться повторно, если попытки обновления завершаются неудачей из-за конкуренции между потоками. Функция применяется к текущему значению в качестве первого аргумента и к заданному обновлению в качестве второго аргумента.
Параметры:
obj — объект, поле которого нужно получить и установить
x — значение обновления
accumulatorFunction — функция двух аргументов без побочных эффектов
Возвращает:
предыдущее значение
С версии:
1.8

accumulateAndGet

public final V accumulateAndGet(T obj, V x, BinaryOperator<V> accumulatorFunction)
Атомарно обновляет поле заданного объекта, управляемое этим средством обновления (с эффектами памяти, указанными в VarHandle.compareAndSet(Object...)), результатом применения заданной функции к текущему и заданному значениям и возвращает обновлённое значение. Функция не должна иметь побочных эффектов, поскольку она может применяться повторно, если попытки обновления завершаются неудачей из-за конкуренции между потоками. Функция применяется к текущему значению в качестве первого аргумента и к заданному обновлению в качестве второго аргумента.
Параметры:
obj — объект, поле которого нужно получить и установить
x — значение обновления
accumulatorFunction — функция двух аргументов без побочных эффектов
Возвращает:
обновлённое значение
С версии:
1.8

Сообщить об ошибке или предложить улучшение
Дополнительную справочную информацию по 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