Module java.base

Class AtomicReferenceFieldUpdater<T,V>

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 final 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方法的保证要比其他原子类弱。因为此类无法确保字段的所有用法都适合于原子访问的目的,所以它只能保证相对于同一更新器上的其他compareAndSetset调用的原子性。

对于不是传递给newUpdater(java.lang.Class<U>, java.lang.Class<W>, java.lang.String)的类的实例作为类型T的参数对象,将导致抛出ClassCastException

自 JDK 版本:
1.5
  • Constructor Details

    • AtomicReferenceFieldUpdater

      protected AtomicReferenceFieldUpdater()
      供子类使用的保护性空构造函数。
  • Method Details

    • newUpdater

      public static <U, W> AtomicReferenceFieldUpdater<U,W> newUpdater(Class<U> tclass, Class<W> vclass, String fieldName)
      创建并返回一个用于具有给定字段的对象的更新器。需要Class参数来检查反射类型和泛型类型是否匹配。
      类型参数:
      U - tclass 的实例的类型
      W - vclass 的实例的类型
      参数:
      tclass - 持有字段的对象的类
      vclass - 字段的类
      fieldName - 要更新的字段的名称
      返回:
      更新器
      抛出:
      ClassCastException - 如果字段类型错误
      IllegalArgumentException - 如果字段不是volatile
      RuntimeException - 如果类不包含字段或类型错误,或者根据Java语言访问控制,字段对调用者不可访问,带有嵌套的基于反射的异常
    • 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是作为volatile存储操作的。
      参数:
      obj - 要设置字段的对象
      newValue - 新值
    • lazySet

      public abstract void lazySet(T obj, V newValue)
      最终将由此更新器管理的给定对象的字段设置为给定的更新值。
      参数:
      obj - 要设置字段的对象
      newValue - 新值
      自 JDK 版本:
      1.6
    • get

      public abstract V get(T obj)
      返回由此更新器管理的给定对象的字段中保存的当前值。
      参数:
      obj - 要获取字段的对象
      返回:
      当前值
    • 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 - 无副作用的函数
      返回:
      先前的值
      自 JDK 版本:
      1.8
    • updateAndGet

      public final V updateAndGet(T obj, UnaryOperator<V> updateFunction)
      使用给定函数应用于当前值的结果来原子更新(具有由VarHandle.compareAndSet(java.lang.Object...)指定的内存效果)此更新器管理的给定对象的字段,并返回更新后的值。由于线程之间的争用,尝试更新失败时,该函数可能会被重新应用,因此该函数应是无副作用的。
      参数:
      obj - 要获取和设置字段的对象
      updateFunction - 无副作用的函数
      返回:
      更新后的值
      自 JDK 版本:
      1.8
    • getAndAccumulate

      public final V getAndAccumulate(T obj, V x, BinaryOperator<V> accumulatorFunction)
      使用给定函数应用于当前值和给定值的结果来原子更新(具有由VarHandle.compareAndSet(java.lang.Object...)指定的内存效果)此更新器管理的给定对象的字段,并返回先前的值。由于线程之间的争用,尝试更新失败时,该函数可能会被重新应用,因此该函数应是无副作用的。该函数将当前值作为第一个参数,给定的更新值作为第二个参数。
      参数:
      obj - 要获取和设置字段的对象
      x - 更新值
      accumulatorFunction - 两个参数的无副作用函数
      返回:
      先前的值
      自 JDK 版本:
      1.8
    • accumulateAndGet

      public final V accumulateAndGet(T obj, V x, BinaryOperator<V> accumulatorFunction)
      通过使用VarHandle.compareAndSet(java.lang.Object...)指定的内存效果,以原子方式更新由此更新程序管理的给定对象的字段,使用给定函数将当前值和给定值的结果应用于当前值,并返回更新后的值。该函数应该是无副作用的,因为在线程之间的争用导致尝试更新失败时,可能会重新应用该函数。该函数将当前值作为第一个参数,给定的更新值作为第二个参数应用。
      参数:
      obj - 要获取和设置字段的对象
      x - 更新值
      accumulatorFunction - 一个具有两个参数的无副作用函数
      返回值:
      更新后的值
      自版本:
      1.8