- 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
方法的保证弱于其他原子类。 因为这个类不能确保该字段的所有用途都适用于原子访问的目的,所以它只能在同一更新程序上compareAndSet
和set
其他调用的原子性。类型为
T
参数的对象参数不是传递给newUpdater(java.lang.Class<U>, java.lang.Class<W>, java.lang.String)
的类的实例将导致抛出ClassCastException
。- 从以下版本开始:
- 1.5
-
-
构造方法摘要
构造方法 Modifier Constructor 描述 protected
AtomicReferenceFieldUpdater()
受保护的do-nothing构造函数供子类使用。
-
方法摘要
所有方法 静态方法 接口方法 抽象方法 具体的方法 Modifier and Type 方法 描述 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
get(T obj)
返回由此更新程序管理的给定对象的字段中保留的当前值。V
getAndAccumulate(T obj, V x, BinaryOperator<V> accumulatorFunction)
原始更新(由VarHandle.compareAndSet(java.lang.Object...)
指定的内存效果)由此更新程序管理的给定对象的字段,并将给定函数应用于当前值和给定值,返回上一个值。V
getAndSet(T obj, V newValue)
将由此更新程序管理的给定对象的字段原子设置为给定值,并返回旧值。V
getAndUpdate(T obj, UnaryOperator<V> updateFunction)
原始更新(由VarHandle.compareAndSet(java.lang.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)
将由此更新程序管理的给定对象的字段设置为给定的更新值。V
updateAndGet(T obj, UnaryOperator<V> updateFunction)
由更新器管理的给定对象的字段与应用给定函数的结果进行原子更新(具有VarHandle.compareAndSet(java.lang.Object...)
指定的内存效果),返回更新的值。abstract boolean
weakCompareAndSet(T obj, V expect, V update)
如果当前值为==
的预期值,则将由此更新程序管理的给定对象的字段原子设置为给定的更新值。
-
-
-
方法详细信息
-
newUpdater
public static <U,W> AtomicReferenceFieldUpdater<U,W> newUpdater(Class<U> tclass, Class<W> vclass, String fieldName)
创建并返回具有给定字段的对象的更新程序。 需要Class参数来检查反射类型和通用类型是否匹配。- 参数类型
-
U
- tclass的实例的类型 -
W
-W
的实例类型 - 参数
-
tclass
- 持有该字段的对象的类 -
vclass
- 该字段的类 -
fieldName
- 要更新的字段的名称 - 结果
- 更新者
- 异常
-
ClassCastException
- 如果该字段的类型错误 -
IllegalArgumentException
- 如果字段不是挥发性的 -
RuntimeException
- 如果类不保留字段或错误的类型,或者根据Java语言访问控制,该调用者无法访问该字段,RuntimeException
使用嵌套的基于反射的异常
-
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
,该方法保证是原子的,但不一定与本领域的其他更改相关。May fail spuriously and does not provide ordering guarantees ,所以很少是
compareAndSet
的适当替代compareAndSet
。- 参数
-
obj
- 有条件设置字段的对象 -
expect
- 预期值 -
update
- 新值 - 结果
-
true
如果成功
-
set
public abstract void set(T obj, V newValue)
将由此更新程序管理的给定对象的字段设置为给定的更新值。 该操作被保证作为关于compareAndSet
后续调用的易失性存储。- 参数
-
obj
- 要设置的字段的对象 -
newValue
- 新值
-
lazySet
public abstract void lazySet(T obj, V newValue)
最终将由此更新程序管理的给定对象的字段设置为给定的更新值。- 参数
-
obj
- 要设置的字段的对象 -
newValue
- 新值 - 从以下版本开始:
- 1.6
-
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
-
-