您的位置:首页 > Web前端

java并发编程:线程安全管理类--原子操作类--AtomicReferenceFieldUpdater<T,V>

2016-03-08 17:10 936 查看

1.类 AtomicReferenceFieldUpdater<T,V>

public abstract class AtomicReferenceFieldUpdater<T,V>extends Object

基于反射的实用工具,可以对指定类的指定
volatile
字段进行原子更新。该类用于原子数据结构,该结构中同一节点的几个引用字段都独立受原子更新控制。例如,树节点可能声明为

class Node {
private volatile Node left, right;

private static final AtomicReferenceFieldUpdater leftUpdater =
AtomicReferenceFieldUpdater.newUpdater(Node.class, Node.class, "left");
private static AtomicReferenceFieldUpdater 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
的其他调用,它仅可以保证原子性和可变语义。

2.构造函数详解

AtomicReferenceFieldUpdater

protected AtomicReferenceFieldUpdater()

受保护的无操作构造方法,供子类使用。

3.方法详解

newUpdater

public static <U,W> AtomicReferenceFieldUpdater<U,W> newUpdater(Class<U> tclass,
Class<W> vclass,
String fieldName)

使用给定的字段为对象创建和返回一个更新器。需要 Class 参数检查反射类型和一般类型是否匹配。

参数:
tclass
- 保持字段的对象类。
vclass
- 该字段的类
fieldName
- 要更新的字段名称。返回:更新器抛出:
IllegalArgumentException
- 如果该字段不是可变引用类型。
RuntimeException
- 如果该类不保持字段,或者是错误的类型,将抛出 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
的其他调用,此方法可以确保原子性,但对于字段中的其他更改则不一定确保原子性。
可能意外失败并且不提供排序保证,所以只有在很少的情况下才对
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

get

public abstract V get(T obj)

获取由此更新器管理的在给定对象的字段中保持的当前值。

参数:
obj
- 要获取其字段的对象返回:当前值

getAndSet

public V getAndSet(T obj,
V newValue)

将此更新器管理的给定对象的字段自动设置为给定值,并返回旧值。

参数:
obj
- 要获取并设置其字段的对象
newValue
- 新值返回:以前的值
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: