JUC原子类-类成员(五)
生活随笔
收集整理的這篇文章主要介紹了
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原子类-类成员(五)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JUC原子类-引用类型(四)
- 下一篇: JUC锁-框架与基本概念(一)