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


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

    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)
    如果当前值 == 预期值,则以原子方式将此更新器管理的给定对象的字段设置为给定的更新值。对 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 - 新值
    返回:
    以前的值
  • 相关阅读:
    easypoi添加下拉预选值
    java启动项目字符编码和配置文件的字符编码问题
    leetcode
    leetcode
    leetcode
    leetcode
    事务的隔离级别- 极客时间()
    数据库的事务
    SQL中的视图(极客时间)
    SQL中的连接(极客时间)
  • 原文地址:https://www.cnblogs.com/tonylovett/p/5254765.html
Copyright © 2020-2023  润新知