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- 新值返回:以前的值
相关文章推荐
- java并发编程:线程安全管理类--原子操作类--AtomicReferenceArray<E>
- js,base64加密
- css实现h5页面滚动效果
- JS数字转大写中文金钱JS函数
- java并发编程:线程安全管理类--原子操作类--AtomicReference<V>
- Extjs4----anchor布局
- AngularJS 指令的 Scope (作用域)
- java并发编程:线程安全管理类--原子操作类--AtomicMarkableReference<V>
- 对js原型对象的拓展和原型对象的重指向的区别的研究
- 剑指offer 二维数组中的查找
- 利用jQuery设计一个简单的web音乐播放器的实例分享
- jquery 事件冒泡 解决 ie firefox 兼容性问题
- 实现jquery EasyUI tabs选项卡关闭图标后载入自己定义事件
- 四个好看的CSS样式表格
- 共享onload事件的使用(javascriptDOM编程艺术学习笔记)
- react与native异步交互的几种方式
- Bootstrap~多级导航(级联导航)的实现效果【附代码】
- 详解javascript闭包
- ByteBuffer用法小结
- JS 连续等号赋值问题