摘要:調用獲取字段在對象中的偏移量其實就是一個字段到對象頭部的偏移量,通過這個偏移量可以快速定位字段定義為類型,保證在多線程中的可見性調用參數為當前對象,偏移量,操作值最后是由于獲取的值為交換前的值通過返回循環獲取最新內存值方法包含兩個參數
unsafe.objectFieldOffset
調用unsafe.objectFieldOffset獲取value字段在對象中的偏移量(其實就是一個字段到對象頭部的偏移量,通過這個偏移量可以快速定位字段)
static { try { valueOffset = unsafe.objectFieldOffset(AtomicInteger.class.getDeclaredField("value")); } catch (Exception ex) { throw new Error(ex); } }
定義value為volatile類型,保證value在多線程中的可見性
private volatile int value;decrementAndGet
調用unsafe.getAndAddInt,參數為當前對象,偏移量,操作值
/** * Atomically decrements by one the current value. * * @return the updated value */ public final int decrementAndGet() { //最后-1是由于getAndAddInt獲取的值為交換前的值 return unsafe.getAndAddInt(this, valueOffset, -1) - 1; }
getAndAddInt
通過compareAndSwapInt返回循環getIntVolatile獲取最新內存值
public final int getAndAddInt(Object var1, long var2, int var4) { int var5; do { var5 = this.getIntVolatile(var1, var2); } while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4)); return var5; }
getIntVolatile
方法包含兩個參數,當前對象,偏移量;獲取內存地址指向的整數,并支持volatile語義
public native int getIntVolatile(Object var1, long var2);
compareAndSwapInt
方法包含了四個參數,當前對象,偏移量,期望值,新值;如果當前對象對應偏移量的值與期望值相同,則把當前對象的值更改為新值,并返回true;否則返回false
public final native boolean compareAndSwapInt(Object var1, long var2, int var4, int var5);
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/73340.html
摘要:提供這些原子類的目的就是為了解決基本類型操作的非原子性導致在多線程并發情況下引發的問題。測試代碼引發的線程問題最終的值為如果是原子操作,那么結果應該就是,反復運行幾次發現結果大部分情況下都不是,這也證明了的非原子性在多線程下產生的問題。 AtomicInteger的原理 java的并發原子包里面提供了很多可以進行原子操作的類,比如: AtomicInteger AtomicBoole...
原子變量 java.util.concurrent.atomic包定義了支持單個變量的原子操作的類,所有類都有get和set方法,類似于對volatile變量的讀寫操作,也就是說,set與在同一個變量上任何后續的get具有先發生關系,compareAndSet原子方法也具有這些內存一致性特性,適用于整數原子變量的簡單原子算法也是如此。 要查看如何使用此包,讓我們返回我們最初用于演示線程干擾的Cou...
摘要:池化技術簡介在我們使用數據庫的過程中,我們往往使用數據庫連接池而不是直接使用數據庫連接進行操作,這是因為每一個數據庫連接的創建和銷毀的代價是昂貴的,而池化技術則預先創建了資源,這些資源是可復用的這樣就保證了在多用戶情況下只能使用指定數目的資 池化技術簡介 在我們使用數據庫的過程中,我們往往使用數據庫連接池而不是直接使用數據庫連接進行操作,這是因為每一個數據庫連接的創建和銷毀的代價是昂貴...
摘要:顧名思義,是類型的線程安全原子類,可以在應用程序中以原子的方式更新值。創建對象先來看下對象的創建。也就是說當一個線程修改一個共享變量時,其它線程能立即讀到這個修改的值。 showImg(https://segmentfault.com/img/remote/1460000016012210); 本文首發于一世流云的專欄:https://segmentfault.com/blog... ...
閱讀 2041·2021-11-12 10:36
閱讀 1912·2021-11-09 09:49
閱讀 2615·2021-11-04 16:12
閱讀 1161·2021-10-09 09:57
閱讀 3253·2019-08-29 17:24
閱讀 1925·2019-08-29 15:12
閱讀 1285·2019-08-29 14:07
閱讀 1300·2019-08-29 12:53