AtomicReferenceFieldUpdater類的使用

?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>
&emsp;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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容