?AtomicReferenceFieldUpdater是一個(gè)基于反射的類,它允許原子更新指定類的指定voltile字段。
?分析如下:
該類的構(gòu)造方法protected化,只允許子類調(diào)用,其提供了newUpdater方法用于創(chuàng)建AtomicReferenceFieldUpdater實(shí)例。
//tclass表示該字段所在的類,vclass表示該字段的類型,fieldName表示要更新的字段名<br>
public static <U,W> AtomicReferenceFieldUpdater<U,W> newUpdater(Class<U> tclass,Class<W> vclass,String fieldName) {<br>
 return new AtomicReferenceFieldUpdaterImpl<U,W>(tclass, vclass, fieldName, Reflection.getCallerClass());<br>
}
該方法會(huì)檢查反射類型參數(shù)與泛型類型是否匹配。
?主要方法如下:
//原子更新指定對(duì)象的指定字段的值,當(dāng)當(dāng)前值等于預(yù)期值時(shí),則用update更新該值,成功返回true<br>
public final boolean compareAndSet(T obj, V expect, V update);
//將給定對(duì)象的指定字段設(shè)置為指定值<br>
public final void set(T obj, V newValue);<br>
//原子更新指定對(duì)象的指定字段的值<br>
public abstract boolean weakCompareAndSet(T obj, V expect, V update);<br>
//將給定對(duì)象的指定字段更新為指定值,與set不同的是,該方法不會(huì)立刻修改舊值,而是會(huì)延遲一些<br>
public final void lazySet(T obj, V newValue);<br>
//獲取此更新器管理的指定對(duì)象的字段的當(dāng)前值<br>
public final V get(T obj);<br>
//原子更新該更新器管理的指定對(duì)象的字段的值為newValue,返回舊值<br>
public V getAndSet(T obj, V newValue);<br>
原子更新更新器管理的指定對(duì)象的值,newValue為updateFunction的apply方法返回的值<br>
public final V updateAndGet(T obj, UnaryOperator<V> updateFunction);<br>
//通過給定值和當(dāng)前值計(jì)算新值,進(jìn)行原子更新,返回舊值
public final V getAndAccumulate(T obj, V x,BinaryOperator<V> accumulatorFunction);<br>
//與上一個(gè)方法相同,不同在于返回新值
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