日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JUC原子类-类成员(五)

發布時間:2024/2/28 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JUC原子类-类成员(五) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

AtomicLongFieldUpdater介紹:

AtomicLongFieldUpdater可以對指定”類的 ‘volatile long’類型的成員”進行原子更新。它是基于反射原理實現的。

AtomicLongFieldUpdater函數列表

// 受保護的無操作構造方法,供子類使用。 protected AtomicLongFieldUpdater()// 以原子方式將給定值添加到此更新器管理的給定對象的字段的當前值。 long addAndGet(T obj, long delta) // 如果當前值 == 預期值,則以原子方式將此更新器所管理的給定對象的字段設置為給定的更新值。 abstract boolean compareAndSet(T obj, long expect, long update) // 以原子方式將此更新器管理的給定對象字段當前值減 1。 long decrementAndGet(T obj) // 獲取此更新器管理的在給定對象的字段中保持的當前值。 abstract long get(T obj) // 以原子方式將給定值添加到此更新器管理的給定對象的字段的當前值。 long getAndAdd(T obj, long delta) // 以原子方式將此更新器管理的給定對象字段當前值減 1。 long getAndDecrement(T obj) // 以原子方式將此更新器管理的給定對象字段的當前值加 1。 long getAndIncrement(T obj) // 將此更新器管理的給定對象的字段以原子方式設置為給定值,并返回舊值。 long getAndSet(T obj, long newValue) // 以原子方式將此更新器管理的給定對象字段當前值加 1。 long incrementAndGet(T obj) // 最后將此更新器管理的給定對象的字段設置為給定更新值。 abstract void lazySet(T obj, long newValue) // 為對象創建并返回一個具有給定字段的更新器。 static <U> AtomicLongFieldUpdater<U> newUpdater(Class<U> tclass, String fieldName) // 將此更新器管理的給定對象的字段設置為給定更新值。 abstract void set(T obj, long newValue) // 如果當前值 == 預期值,則以原子方式將此更新器所管理的給定對象的字段設置為給定的更新值。 abstract boolean weakCompareAndSet(T obj, long expect, long update)

AtomicLongFieldUpdater源碼分析

newUpdater()

public static <U> AtomicLongFieldUpdater<U> newUpdater(Class<U> tclass, String fieldName) {Class<?> caller = Reflection.getCallerClass();if (AtomicLong.VM_SUPPORTS_LONG_CAS)return new CASUpdater<U>(tclass, fieldName, caller);elsereturn new LockedUpdater<U>(tclass, fieldName, caller); }

說明:
說明:newUpdater()的作用是獲取一個AtomicIntegerFieldUpdater類型的對象。
它實際上返回的是CASUpdater對象,或者LockedUpdater對象;具體返回哪一個類取決于JVM是否支持long類型的CAS函數。CASUpdater和LockedUpdater都是AtomicIntegerFieldUpdater的子類,它們的實現類似。下面以CASUpdater來進行說明。

CASUpdater類的源碼如下:

public boolean compareAndSet(T obj, long expect, long update) {if (obj == null || obj.getClass() != tclass || cclass != null) fullCheck(obj);return unsafe.compareAndSwapLong(obj, offset, expect, update); }

例子:

// LongTest.java的源碼 import java.util.concurrent.atomic.AtomicLongFieldUpdater;public class LongFieldTest {public static void main(String[] args) {// 獲取Person的class對象Class cls = Person.class; // 新建AtomicLongFieldUpdater對象,傳遞參數是“class對象”和“long類型在類中對應的名稱”AtomicLongFieldUpdater mAtoLong = AtomicLongFieldUpdater.newUpdater(cls, "id");Person person = new Person(12345678L);// 比較person的"id"屬性,如果id的值為12345678L,則設置為1000。mAtoLong.compareAndSet(person, 12345678L, 1000);System.out.println("id="+person.getId());} }class Person {volatile long id;public Person(long id) {this.id = id;}public void setId(long id) {this.id = id;}public long getId() {return id;} }

運行結果:
id=1000

總結

以上是生活随笔為你收集整理的JUC原子类-类成员(五)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。