java.lang.Object
java.util.concurrent.atomic.AtomicReferenceFieldUpdater<T,V>
- 类型参数:
-
T
- 持有可更新字段的对象的类型 -
V
- 字段的类型
一个基于反射的实用程序,可使指定类的指定
volatile
引用字段的原子更新成为可能。该类设计用于原子数据结构中,其中同一节点的多个引用字段独立地可以进行原子更新。例如,树节点可以声明为
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
}
请注意,此类中compareAndSet
方法的保证要比其他原子类弱。因为此类无法确保字段的所有用法都适合于原子访问的目的,所以它只能保证相对于同一更新器上的其他compareAndSet
和set
调用的原子性。
对于不是传递给newUpdater(java.lang.Class<U>, java.lang.Class<W>, java.lang.String)
的类的实例作为类型T
的参数对象,将导致抛出ClassCastException
。
- 自 JDK 版本:
- 1.5
-
Constructor Summary
-
Method Summary
Modifier and TypeMethodDescriptionfinal V
accumulateAndGet
(T obj, V x, BinaryOperator<V> accumulatorFunction) 使用给定函数应用于当前值和给定值的结果来原子更新(具有由VarHandle.compareAndSet(java.lang.Object...)
指定的内存效果)此更新器管理的对象的字段,并返回更新后的值。abstract boolean
compareAndSet
(T obj, V expect, V update) 如果当前值==
期望值,则将给定对象的字段原子设置为给定的更新值。abstract V
返回由此更新器管理的给定对象的字段中保存的当前值。final V
getAndAccumulate
(T obj, V x, BinaryOperator<V> accumulatorFunction) 使用给定函数应用于当前值和给定值的结果来原子更新(具有由VarHandle.compareAndSet(java.lang.Object...)
指定的内存效果)此更新器管理的给定对象的字段,并返回先前的值。将由此更新器管理的给定对象的字段原子设置为给定值,并返回旧值。final V
getAndUpdate
(T obj, UnaryOperator<V> updateFunction) 使用给定函数应用于当前值的结果来原子更新(具有由VarHandle.compareAndSet(java.lang.Object...)
指定的内存效果)此更新器管理的给定对象的字段,并返回先前的值。abstract void
最终将由此更新器管理的给定对象的字段设置为给定的更新值。static <U,
W> AtomicReferenceFieldUpdater <U, W> newUpdater
(Class<U> tclass, Class<W> vclass, String fieldName) 创建并返回一个用于具有给定字段的对象的更新器。abstract void
将由此更新器管理的给定对象的字段设置为给定的更新值。final V
updateAndGet
(T obj, UnaryOperator<V> updateFunction) 使用给定函数应用于当前值的结果来原子更新(具有由VarHandle.compareAndSet(java.lang.Object...)
指定的内存效果)此更新器管理的给定对象的字段,并返回更新后的值。abstract boolean
weakCompareAndSet
(T obj, V expect, V update) 如果当前值==
期望值,则将由此更新器管理的给定对象的字段原子设置为给定的更新值。
-
Constructor Details
-
AtomicReferenceFieldUpdater
protected AtomicReferenceFieldUpdater()供子类使用的保护性空构造函数。
-
-
Method Details
-
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
如果当前值==
期望值,则将由此更新器管理的给定对象的字段原子设置为给定的更新值。此方法保证相对于其他compareAndSet
和set
调用是原子的,但不一定相对于字段的其他更改是原子的。- 参数:
-
obj
- 要有条件设置字段的对象 -
expect
- 期望的值 -
update
- 新值 - 返回:
-
如果成功则
true
-
weakCompareAndSet
如果当前值==
期望值,则将由此更新器管理的给定对象的字段原子设置为给定的更新值。此方法保证相对于其他compareAndSet
和set
调用是原子的,但不一定相对于字段的其他更改是原子的。此操作可能会出现偶然失败,并且不提供排序保证,因此很少是
compareAndSet
的适当替代方案。- 参数:
-
obj
- 要有条件设置字段的对象 -
expect
- 期望的值 -
update
- 新值 - 返回:
-
如果成功则
true
-
set
将由此更新器管理的给定对象的字段设置为给定的更新值。此操作保证相对于后续调用compareAndSet
是作为volatile存储操作的。- 参数:
-
obj
- 要设置字段的对象 -
newValue
- 新值
-
lazySet
最终将由此更新器管理的给定对象的字段设置为给定的更新值。- 参数:
-
obj
- 要设置字段的对象 -
newValue
- 新值 - 自 JDK 版本:
- 1.6
-
get
返回由此更新器管理的给定对象的字段中保存的当前值。- 参数:
-
obj
- 要获取字段的对象 - 返回:
- 当前值
-
getAndSet
将由此更新器管理的给定对象的字段原子设置为给定值,并返回旧值。- 参数:
-
obj
- 要获取和设置字段的对象 -
newValue
- 新值 - 返回:
- 先前的值
-
getAndUpdate
使用给定函数应用于当前值的结果来原子更新(具有由VarHandle.compareAndSet(java.lang.Object...)
指定的内存效果)此更新器管理的给定对象的字段,并返回先前的值。由于线程之间的争用,尝试更新失败时,该函数可能会被重新应用,因此该函数应是无副作用的。- 参数:
-
obj
- 要获取和设置字段的对象 -
updateFunction
- 无副作用的函数 - 返回:
- 先前的值
- 自 JDK 版本:
- 1.8
-
updateAndGet
使用给定函数应用于当前值的结果来原子更新(具有由VarHandle.compareAndSet(java.lang.Object...)
指定的内存效果)此更新器管理的给定对象的字段,并返回更新后的值。由于线程之间的争用,尝试更新失败时,该函数可能会被重新应用,因此该函数应是无副作用的。- 参数:
-
obj
- 要获取和设置字段的对象 -
updateFunction
- 无副作用的函数 - 返回:
- 更新后的值
- 自 JDK 版本:
- 1.8
-
getAndAccumulate
使用给定函数应用于当前值和给定值的结果来原子更新(具有由VarHandle.compareAndSet(java.lang.Object...)
指定的内存效果)此更新器管理的给定对象的字段,并返回先前的值。由于线程之间的争用,尝试更新失败时,该函数可能会被重新应用,因此该函数应是无副作用的。该函数将当前值作为第一个参数,给定的更新值作为第二个参数。- 参数:
-
obj
- 要获取和设置字段的对象 -
x
- 更新值 -
accumulatorFunction
- 两个参数的无副作用函数 - 返回:
- 先前的值
- 自 JDK 版本:
- 1.8
-
accumulateAndGet
通过使用VarHandle.compareAndSet(java.lang.Object...)
指定的内存效果,以原子方式更新由此更新程序管理的给定对象的字段,使用给定函数将当前值和给定值的结果应用于当前值,并返回更新后的值。该函数应该是无副作用的,因为在线程之间的争用导致尝试更新失败时,可能会重新应用该函数。该函数将当前值作为第一个参数,给定的更新值作为第二个参数应用。- 参数:
-
obj
- 要获取和设置字段的对象 -
x
- 更新值 -
accumulatorFunction
- 一个具有两个参数的无副作用函数 - 返回值:
- 更新后的值
- 自版本:
- 1.8
-