java.util.concurrent.atomic

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
   
     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 方法的保证弱于其他原子类中该方法的保证。因为此类不能确保所有使用的字段都适合于原子访问目的,所以,对于 compareAndSetset 的其他调用,它仅可以保证原子性和可变语义。

从以下版本开始:
1.5

构造方法摘要
protected AtomicReferenceFieldUpdater()
          受保护的无操作构造方法,供子类使用。
 
方法摘要
abstract  boolean compareAndSet(T obj, V expect, V update)
          如果当前值 == 预期值,则以原子方式将此更新器管理的给定对象的字段设置为给定的更新值。
abstract  V get(T obj)
          获取由此更新器管理的在给定对象的字段中保持的当前值。
 V getAndSet(T obj, V newValue)
          将此更新器管理的给定对象的字段自动设置为给定值,并返回旧值。
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)
          将此更新器管理的给定对象的字段设置为给定更新值。
abstract  boolean weakCompareAndSet(T obj, V expect, V update)
          如果当前值 == 预期值,则以原子方式将此更新器管理的给定对象的字段设置为给定的更新值。
 
从类 java.lang.Object 继承的方法
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

构造方法详细信息

AtomicReferenceFieldUpdater

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

方法详细信息

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)
如果当前值 == 预期值,则以原子方式将此更新器管理的给定对象的字段设置为给定的更新值。对 compareAndSetset 的其他调用,此方法可以确保原子性,但对于字段中的其他更改则不一定确保原子性。

参数:
obj - 有条件地设置其字段的对象
expect - 预期值
update - 新值
返回:
如果成功,则返回 true。

weakCompareAndSet

public abstract boolean weakCompareAndSet(T obj,
                                          V expect,
                                          V update)
如果当前值 == 预期值,则以原子方式将此更新器管理的给定对象的字段设置为给定的更新值。对 compareAndSetset 的其他调用,此方法可以确保原子性,但对于字段中的其他更改则不一定确保原子性。

可能意外失败并且不提供排序保证,所以只有在很少的情况下才对 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 - 新值
返回:
以前的值