Java原子屬性更新器AtomicReferenceFieldUpdater的用法

AtomicReferenceFieldUpdater是基于反射的工具類苇瓣,用來將指定類型的指定的volatile引用字段進行原子更新孝情,對應的原子引用字段不能是private的。通常一個類volatile成員屬性獲取值措拇、設定為某個值兩個操作時非原子的,若想將其變?yōu)樵拥模瑒t可通過AtomicReferenceFieldUpdater來實現(xiàn)问拘。如下面例子:

public class AtomicReferTest { 
    public static void main(String[] args) throws Exception   {  
        AtomicReferenceFieldUpdater updater=AtomicReferenceFieldUpdater.newUpdater(Dog.class,String.class,"name");  
        Dog dog1=new Dog();  
        System.out.println(updater.compareAndSet(dog1,"dog1","compareAndSet"));        
        System.out.println(dog1.name);  
        System.out.println(updater.getAndSet(dog1, "getAndSet"));
        System.out.println(dog1.name);
    }  
} 
class Dog  
{ volatile  String name="dog1";  

}

輸出結果:

true
compareAndSet
compareAndSet
getAndSet

通過調用AtomicReferenceFieldUpdater.newUpdater(Dog.class,String.class,"name")靜態(tài)方法生成Dog類的String類型的name字段的原子修改器updater,然后調用它的compareAndSet方法判斷dog1對象的name值是否為dog1惧所,若是則返回true并修改其值骤坐。也可調用getAndSet方法直接修改dog1屬性的name字段值,并返回該字段原來的值下愈。

Java類庫中BufferedInputStream就調用了這個類:

public class BufferedInputStream extends FilterInputStream { protected volatile byte buf[]; /* *  原子的更新內部數(shù)組纽绍,比如擴容、關閉時势似, */
    private static final AtomicReferenceFieldUpdater<BufferedInputStream, byte[]> bufUpdater = AtomicReferenceFieldUpdater.newUpdater
        (BufferedInputStream.class,  byte[].class, "buf"); public void close() throws IOException { byte[] buffer; while ( (buffer = buf) != null) { //放在一個循環(huán)中拌夏,如果CAS更新失敗,那么就讀取最新的buf引用履因,繼續(xù)CAS更新
            if (bufUpdater.compareAndSet(this, buffer, null)) {
                InputStream input = in;
                in = null;
                   if (input != null)
                      input.close(); 
                    return;
            }
        }
    }
}

AtomicReferenceFieldUpdater是Doug Lea在Java 5中寫的atomic classes 中Filed Updater的一部分障簿,本質上是volatile字段的包裝器。相似的還有AtomicIntegerFieldUpdater搓逾,具體使用方法可參考:https://github.com/aCoder2013/blog/issues/10

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末卷谈,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子霞篡,更是在濱河造成了極大的恐慌世蔗,老刑警劉巖端逼,帶你破解...
    沈念sama閱讀 216,324評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異污淋,居然都是意外死亡顶滩,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評論 3 392
  • 文/潘曉璐 我一進店門寸爆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來礁鲁,“玉大人,你說我怎么就攤上這事赁豆〗龃迹” “怎么了?”我有些...
    開封第一講書人閱讀 162,328評論 0 353
  • 文/不壞的土叔 我叫張陵魔种,是天一觀的道長析二。 經常有香客問我,道長节预,這世上最難降的妖魔是什么叶摄? 我笑而不...
    開封第一講書人閱讀 58,147評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮安拟,結果婚禮上蛤吓,老公的妹妹穿的比我還像新娘。我一直安慰自己糠赦,他們只是感情好会傲,可當我...
    茶點故事閱讀 67,160評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著愉棱,像睡著了一般唆铐。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上奔滑,一...
    開封第一講書人閱讀 51,115評論 1 296
  • 那天艾岂,我揣著相機與錄音,去河邊找鬼朋其。 笑死王浴,一個胖子當著我的面吹牛,可吹牛的內容都是我干的梅猿。 我是一名探鬼主播氓辣,決...
    沈念sama閱讀 40,025評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼袱蚓!你這毒婦竟也來了钞啸?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,867評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎体斩,沒想到半個月后梭稚,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 45,307評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡絮吵,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,528評論 2 332
  • 正文 我和宋清朗相戀三年弧烤,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蹬敲。...
    茶點故事閱讀 39,688評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡暇昂,死狀恐怖,靈堂內的尸體忽然破棺而出伴嗡,到底是詐尸還是另有隱情急波,我是刑警寧澤,帶...
    沈念sama閱讀 35,409評論 5 343
  • 正文 年R本政府宣布闹究,位于F島的核電站幔崖,受9級特大地震影響,放射性物質發(fā)生泄漏渣淤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,001評論 3 325
  • 文/蒙蒙 一吉嫩、第九天 我趴在偏房一處隱蔽的房頂上張望价认。 院中可真熱鬧,春花似錦自娩、人聲如沸用踩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽脐彩。三九已至,卻和暖如春姊扔,著一層夾襖步出監(jiān)牢的瞬間惠奸,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評論 1 268
  • 我被黑心中介騙來泰國打工恰梢, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留佛南,地道東北人。 一個月前我還...
    沈念sama閱讀 47,685評論 2 368
  • 正文 我出身青樓嵌言,卻偏偏與公主長得像嗅回,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子摧茴,可洞房花燭夜當晚...
    茶點故事閱讀 44,573評論 2 353

推薦閱讀更多精彩內容