模块 java.base

类 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 的其他调用的原子性。

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

自从:
1.5
  • 构造方法详细信息

    • AtomicReferenceFieldUpdater

      protected AtomicReferenceFieldUpdater()
      受保护的无为构造方法供子类使用。
  • 方法详情

    • 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 - 如果字段不可变
      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 的后续调用,此操作保证充当易失性存储。
      参数:
      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 - 新值
      返回:
      以前的值
    • getAndUpdate

      public final V  getAndUpdate(T  obj, UnaryOperator <V > updateFunction)
      使用给定函数的应用结果原子地更新(具有 VarHandle.compareAndSet(java.lang.Object...) 指定的记忆效应)由该更新程序管理的给定对象的字段,返回先前的值。该函数应该是无副作用的,因为当由于线程之间的争用而尝试更新失败时,它可能会被重新应用。
      参数:
      obj - 要获取和设置其字段的对象
      updateFunction - 无副作用的函数
      返回:
      以前的值
      自从:
      1.8
    • updateAndGet

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

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

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