Класс AtomicReferenceFieldUpdater<T,V>
- java.lang.Object
-
- java.util.concurrent.atomic.AtomicReferenceFieldUpdater<T,V>
- Параметры типа:
-
T- Тип объекта, содержащего обновляемое поле -
V- Тип поля
public abstract class AtomicReferenceFieldUpdater<T,V> extends Object
Утилита на основе рефлексии, которая позволяет выполнять атомарные обновления указанных volatile ссылочных полей указанных классов. Этот класс предназначен для использования в атомарных структурах данных, в которых несколько ссылочных полей одного узла независимо подвергаются атомарным обновлениям. Например, узел дерева может быть объявлен как
class Node {
private volatile Node left, right;
private static final AtomicReferenceFieldUpdater<Node, Node> leftUpdater =
AtomicReferenceFieldUpdater.newUpdater(Node.class, Node.class, "left");
private static 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
}
Обратите внимание, что гарантии метода compareAndSet в этом классе слабее, чем в других атомарных классах. Поскольку этот класс не может гарантировать, что все использования поля подходят для целей атомарного доступа, он может гарантировать атомарность только по отношению к другим вызовам compareAndSet и set для одного и того же апдейтера.
Объектные аргументы для параметров типа T , которые не являются экземплярами класса, переданного в newUpdater(java.lang.Class<U>, java.lang.Class<W>, java.lang.String), приведут к исключению ClassCastException.
- С момента:
- 1.5
Конструкторы
| Модификатор | Конструктор | Описание |
|---|---|---|
protected | AtomicReferenceFieldUpdater() | Защищённый конструктор без действий для использования подклассами. |
Методы
| Модификатор и тип | Метод | Описание |
|---|---|---|
V | accumulateAndGet(T obj,
V x,
BinaryOperator<V> accumulatorFunction) | Атомарно обновляет (с эффектами памяти, как указано в |
abstract boolean | compareAndSet(T obj,
V expect,
V update) | Атомарно устанавливает поле данного объекта, управляемого этим апдейтером, в заданное обновлённое значение, если текущее значение |
abstract V | get(T obj) | Возвращает текущее значение, хранящееся в поле данного объекта, управляемого этим апдейтером. |
V | getAndAccumulate(T obj,
V x,
BinaryOperator<V> accumulatorFunction) | Атомарно обновляет (с эффектами памяти, как указано в |
V | getAndSet(T obj,
V newValue) | Атомарно устанавливает поле данного объекта, управляемого этим апдейтером, в заданное значение и возвращает старое значение. |
V | getAndUpdate(T obj,
UnaryOperator<V> updateFunction) | Атомарно обновляет (с эффектами памяти, как указано в |
abstract void | lazySet(T obj,
V newValue) | В конечном итоге устанавливает поле данного объекта, управляемого этим апдейтером, в заданное обновлённое значение. |
static <U,W> | newUpdater(Class<U> tclass,
Class<W> vclass,
String fieldName) | Создаёт и возвращает апдейтер для объектов с данным полем. |
abstract void | set(T obj,
V newValue) | Устанавливает поле данного объекта, управляемого этим апдейтером, в заданное обновлённое значение. |
V | updateAndGet(T obj,
UnaryOperator<V> updateFunction) | Атомарно обновляет (с эффектами памяти, как указано в |
abstract boolean | weakCompareAndSet(T obj,
V expect,
V update) | Атомарно устанавливает поле данного объекта, управляемого этим апдейтером, в заданное обновлённое значение, если текущее значение |
Методы, объявленные в классе java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait Конструкторы
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(java.lang.Object...)) поле данного объекта, управляемого этим апдейтером, результатом применения данного функционального интерфейса, возвращая предыдущее значение. Функция должна быть без побочных эффектов, так как она может быть повторно применена, когда попытки обновления завершаются неудачей из-за конкуренции между потоками.
- Параметры:
-
obj- Объект, чьё поле нужно получить и установить -
updateFunction- функция без побочных эффектов - Возвращает:
- предыдущее значение
- С:
- 1.8
updateAndGet
public final V updateAndGet(T obj,
UnaryOperator<V> updateFunction) Атомарно обновляет (с эффектами памяти, как указано в VarHandle.compareAndSet(java.lang.Object...)) поле данного объекта, управляемого этим апдейтером, результатом применения данного функционального интерфейса, возвращая обновлённое значение. Функция должна быть без побочных эффектов, так как она может быть повторно применена, когда попытки обновления завершаются неудачей из-за конкуренции между потоками.
- Параметры:
-
obj- Объект, чьё поле нужно получить и установить -
updateFunction- функция без побочных эффектов - Возвращает:
- обновлённое значение
- С:
- 1.8
getAndAccumulate
public final V getAndAccumulate(T obj,
V x,
BinaryOperator<V> accumulatorFunction) Атомарно обновляет (с эффектами памяти, как указано в VarHandle.compareAndSet(java.lang.Object...)) поле данного объекта, управляемого этим апдейтером, результатом применения данного функционального интерфейса к текущему и заданным значениям, возвращая предыдущее значение. Функция должна быть без побочных эффектов, так как она может быть повторно применена, когда попытки обновления завершаются неудачей из-за конкуренции между потоками. Функция применяется к текущему значению в качестве первого аргумента и заданному обновлению в качестве второго аргумента.
- Параметры:
-
obj- Объект, чьё поле нужно получить и установить -
x- значение обновления -
accumulatorFunction- функция без побочных эффектов от двух аргументов - Возвращает:
- предыдущее значение
- С:
- 1.8
accumulateAndGet
public final V accumulateAndGet(T obj,
V x,
BinaryOperator<V> accumulatorFunction) Атомарно обновляет (с эффектами памяти, как указано в VarHandle.compareAndSet(java.lang.Object...)) поле данного объекта, управляемого этим апдейтером, результатом применения данного функционального интерфейса к текущему и заданным значениям, возвращая обновлённое значение. Функция должна быть без побочных эффектов, так как она может быть повторно применена, когда попытки обновления завершаются неудачей из-за конкуренции между потоками. Функция применяется к текущему значению в качестве первого аргумента и заданному обновлению в качестве второго аргумента.
- Параметры:
-
obj- Объект, чьё поле нужно получить и установить -
x- значение обновления -
accumulatorFunction- функция без побочных эффектов от двух аргументов - Возвращает:
- обновлённое значение
- С:
- 1.8
© 1993, 2020, 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/11/docs/api/java.base/java/util/concurrent/atomic/AtomicReferenceFieldUpdater.html