public abstract class AtomicReferenceFieldUpdater
extends Object
java.lang.Object | |
↳ | java.util.concurrent.atomic.AtomicReferenceFieldUpdater<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 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
原子性。
Protected constructors |
|
---|---|
AtomicReferenceFieldUpdater() 受保护的无所事事的构造函数供子类使用。 |
Public methods |
|
---|---|
final V |
accumulateAndGet(T obj, V x, BinaryOperator<V> accumulatorFunction) 使用给定函数应用于当前值和给定值的结果,原子更新由此更新程序管理的给定对象的字段,并返回更新后的值。 |
abstract boolean |
compareAndSet(T obj, V expect, V update) 如果当前值为 |
abstract V |
get(T obj) 获取由此更新器管理的给定对象的字段中保存的当前值。 |
final V |
getAndAccumulate(T obj, V x, BinaryOperator<V> accumulatorFunction) 使用给定函数应用到当前值和给定值的结果,原子地更新由此更新程序管理的给定对象的字段,并返回以前的值。 |
V |
getAndSet(T obj, V newValue) 以原子方式将由此更新程序管理的给定对象的字段设置为给定值并返回旧值。 |
final V |
getAndUpdate(T obj, UnaryOperator<V> updateFunction) 使用给定函数的结果原子更新由此更新程序管理的给定对象的字段,并返回以前的值。 |
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) 使用给定函数的结果原子更新由此更新程序管理的给定对象的字段,并返回更新后的值。 |
abstract boolean |
weakCompareAndSet(T obj, V expect, V update) 如果当前值 |
Inherited methods |
|
---|---|
From class java.lang.Object
|
V accumulateAndGet (T obj, V x, BinaryOperator<V> accumulatorFunction)
使用给定函数应用于当前值和给定值的结果,原子更新由此更新程序管理的给定对象的字段,并返回更新后的值。 该函数应该是无副作用的,因为当尝试更新由于线程之间的争用而失败时,它可能会被重新应用。 该函数以当前值作为第一个参数,给定更新作为第二个参数应用。
Parameters | |
---|---|
obj |
T : An object whose field to get and set |
x |
V : the update value |
accumulatorFunction |
BinaryOperator : a side-effect-free function of two arguments |
Returns | |
---|---|
V |
the updated value |
boolean compareAndSet (T obj, V expect, V update)
如果当前值==
为期望值, ==
原子方式将此更新程序管理的给定对象的字段设置为给定的更新值。 对于其他compareAndSet
和set
调用,这种方法保证是原子的,但不一定与该领域的其他变化有关。
Parameters | |
---|---|
obj |
T : An object whose field to conditionally set |
expect |
V : the expected value |
update |
V : the new value |
Returns | |
---|---|
boolean |
true if successful |
V get (T obj)
获取由此更新器管理的给定对象的字段中保存的当前值。
Parameters | |
---|---|
obj |
T : An object whose field to get |
Returns | |
---|---|
V |
the current value |
V getAndAccumulate (T obj, V x, BinaryOperator<V> accumulatorFunction)
使用给定函数应用到当前值和给定值的结果,原子地更新由此更新程序管理的给定对象的字段,并返回以前的值。 该函数应该是无副作用的,因为当尝试更新由于线程之间的争用而失败时,它可能会被重新应用。 该函数以当前值作为第一个参数,给定更新作为第二个参数应用。
Parameters | |
---|---|
obj |
T : An object whose field to get and set |
x |
V : the update value |
accumulatorFunction |
BinaryOperator : a side-effect-free function of two arguments |
Returns | |
---|---|
V |
the previous value |
V getAndSet (T obj, V newValue)
以原子方式将由此更新程序管理的给定对象的字段设置为给定值并返回旧值。
Parameters | |
---|---|
obj |
T : An object whose field to get and set |
newValue |
V : the new value |
Returns | |
---|---|
V |
the previous value |
V getAndUpdate (T obj, UnaryOperator<V> updateFunction)
使用给定函数的结果原子更新由此更新程序管理的给定对象的字段,并返回以前的值。 该函数应该是无副作用的,因为当尝试更新由于线程之间的争用而失败时,它可能会被重新应用。
Parameters | |
---|---|
obj |
T : An object whose field to get and set |
updateFunction |
UnaryOperator : a side-effect-free function |
Returns | |
---|---|
V |
the previous value |
void lazySet (T obj, V newValue)
最终将由此更新程序管理的给定对象的字段设置为给定的更新值。
Parameters | |
---|---|
obj |
T : An object whose field to set |
newValue |
V : the new value |
AtomicReferenceFieldUpdater<U, W> newUpdater (Class<U> tclass, Class<W> vclass, String fieldName)
创建并返回具有给定字段的对象的更新程序。 需要Class参数来检查反射类型和泛型类型是否匹配。
Parameters | |
---|---|
tclass |
Class : the class of the objects holding the field |
vclass |
Class : the class of the field |
fieldName |
String : the name of the field to be updated |
Returns | |
---|---|
AtomicReferenceFieldUpdater<U, W> |
the updater |
Throws | |
---|---|
ClassCastException |
if the field is of the wrong type |
IllegalArgumentException |
if the field is not volatile |
RuntimeException |
with a nested reflection-based exception if the class does not hold field or is the wrong type, or the field is inaccessible to the caller according to Java language access control |
void set (T obj, V newValue)
将由此更新程序管理的给定对象的字段设置为给定的更新值。 该操作保证作为对后续调用compareAndSet
的不稳定存储。
Parameters | |
---|---|
obj |
T : An object whose field to set |
newValue |
V : the new value |
V updateAndGet (T obj, UnaryOperator<V> updateFunction)
使用给定函数的结果原子更新由此更新程序管理的给定对象的字段,并返回更新后的值。 该函数应该是无副作用的,因为当尝试更新由于线程之间的争用而失败时,它可能会被重新应用。
Parameters | |
---|---|
obj |
T : An object whose field to get and set |
updateFunction |
UnaryOperator : a side-effect-free function |
Returns | |
---|---|
V |
the updated value |
boolean weakCompareAndSet (T obj, V expect, V update)
如果当前值==
是期望值,则将由此更新程序管理的给定对象的字段按原子级设置为给定的更新值。 与其他compareAndSet
和set
调用set
,此方法在原子方面保证是原子的,但不一定与该领域的其他更改有关。
May fail spuriously and does not provide ordering guarantees ,所以只有很少的 compareAndSet
合适的选择。
Parameters | |
---|---|
obj |
T : An object whose field to conditionally set |
expect |
V : the expected value |
update |
V : the new value |
Returns | |
---|---|
boolean |
true if successful |