美文网首页
AtomicReferenceFieldUpdater类的使用

AtomicReferenceFieldUpdater类的使用

作者: 千释炎 | 来源:发表于2017-08-24 12:01 被阅读0次

     AtomicReferenceFieldUpdater是一个基于反射的类,它允许原子更新指定类的指定voltile字段。
     分析如下:
    该类的构造方法protected化,只允许子类调用,其提供了newUpdater方法用于创建AtomicReferenceFieldUpdater实例。

    //tclass表示该字段所在的类,vclass表示该字段的类型,fieldName表示要更新的字段名<br>
    public static <U,W> AtomicReferenceFieldUpdater<U,W> newUpdater(Class<U> tclass,Class<W> vclass,String  fieldName) {<br>
    &emsp;return new AtomicReferenceFieldUpdaterImpl<U,W>(tclass, vclass, fieldName, Reflection.getCallerClass());<br>
    }
    

    该方法会检查反射类型参数与泛型类型是否匹配。
     主要方法如下:

    //原子更新指定对象的指定字段的值,当当前值等于预期值时,则用update更新该值,成功返回true<br>
    public final boolean compareAndSet(T obj, V expect, V update);
    //将给定对象的指定字段设置为指定值<br>
     public final void set(T obj, V newValue);<br>
    //原子更新指定对象的指定字段的值<br>
    public abstract boolean weakCompareAndSet(T obj, V expect, V update);<br>
    //将给定对象的指定字段更新为指定值,与set不同的是,该方法不会立刻修改旧值,而是会延迟一些<br>
    public final void lazySet(T obj, V newValue);<br>
    //获取此更新器管理的指定对象的字段的当前值<br>
    public final V get(T obj);<br>
    //原子更新该更新器管理的指定对象的字段的值为newValue,返回旧值<br>
    public V getAndSet(T obj, V newValue);<br>
    原子更新更新器管理的指定对象的值,newValue为updateFunction的apply方法返回的值<br>
    public final V updateAndGet(T obj, UnaryOperator<V> updateFunction);<br>
    //通过给定值和当前值计算新值,进行原子更新,返回旧值
    public final V getAndAccumulate(T obj, V x,BinaryOperator<V> accumulatorFunction);<br>
    //与上一个方法相同,不同在于返回新值
    public final V accumulateAndGet(T obj, V 
    x,BinaryOperator<V> accumulatorFunction);<br>
    

     例子如下:

    import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;
    import java.util.function.BinaryOperator;
    public class AtomicReferenceFieldUpdaterDeo {
         public static void main(String args[]) 
            Person person=new Person(1001,"whisper");
            AtomicReferenceFieldUpdater<Person,String> 
    updater=AtomicReferenceFieldUpdater.newUpdater(Person.class,String.class,"name");
            boolean isSuccess=updater.compareAndSet
    (person,"whisper","godyan");
            System.out.println("修改后的name为:"+person.getName
    ());
        }
    }
    

    输出为:修改后的name为:godyan

    import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;
    import java.util.function.BinaryOperator;
    public class AtomicReferenceFieldUpdaterDeo {
         public static void main(String args[]) {
              Person person=new Person(1001,"whisper");
              AtomicReferenceFieldUpdater<Person,String> 
    updater=AtomicReferenceFieldUpdater.newUpdater
    (Person.class,String.class,"name");
              String result=updater.getAndAccumulate(person,
     "godyan",new BinaryOperator<String>() {
                  @Override
                  public String apply(String t, String u) {
                     // TODO Auto-generated method stub
                     return t+u;
                  }
              });
              System.out.println("修改前的name为:"+result+"-修
    改后的name为:"+person.getName());
         }
    }
    

    输出为:修改前的name为:whisper-修改后的name为:whispergodyan

    相关文章

      网友评论

          本文标题:AtomicReferenceFieldUpdater类的使用

          本文链接:https://www.haomeiwen.com/subject/qsasdxtx.html