AtomicReferenceFieldUpdater类的使用

 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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容