摘要:調(diào)用獲取字段在對象中的偏移量其實就是一個字段到對象頭部的偏移量,通過這個偏移量可以快速定位字段定義為類型,保證在多線程中的可見性調(diào)用參數(shù)為當前對象,偏移量,操作值最后是由于獲取的值為交換前的值通過返回循環(huán)獲取最新內(nèi)存值方法包含兩個參數(shù)
unsafe.objectFieldOffset
調(diào)用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
調(diào)用unsafe.getAndAddInt,參數(shù)為當前對象,偏移量,操作值
/** * 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返回循環(huán)getIntVolatile獲取最新內(nèi)存值
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
方法包含兩個參數(shù),當前對象,偏移量;獲取內(nèi)存地址指向的整數(shù),并支持volatile語義
public native int getIntVolatile(Object var1, long var2);
compareAndSwapInt
方法包含了四個參數(shù),當前對象,偏移量,期望值,新值;如果當前對象對應(yīng)偏移量的值與期望值相同,則把當前對象的值更改為新值,并返回true;否則返回false
public final native boolean compareAndSwapInt(Object var1, long var2, int var4, int var5);
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/73340.html
摘要:提供這些原子類的目的就是為了解決基本類型操作的非原子性導(dǎo)致在多線程并發(fā)情況下引發(fā)的問題。測試代碼引發(fā)的線程問題最終的值為如果是原子操作,那么結(jié)果應(yīng)該就是,反復(fù)運行幾次發(fā)現(xiàn)結(jié)果大部分情況下都不是,這也證明了的非原子性在多線程下產(chǎn)生的問題。 AtomicInteger的原理 java的并發(fā)原子包里面提供了很多可以進行原子操作的類,比如: AtomicInteger AtomicBoole...
原子變量 java.util.concurrent.atomic包定義了支持單個變量的原子操作的類,所有類都有g(shù)et和set方法,類似于對volatile變量的讀寫操作,也就是說,set與在同一個變量上任何后續(xù)的get具有先發(fā)生關(guān)系,compareAndSet原子方法也具有這些內(nèi)存一致性特性,適用于整數(shù)原子變量的簡單原子算法也是如此。 要查看如何使用此包,讓我們返回我們最初用于演示線程干擾的Cou...
摘要:池化技術(shù)簡介在我們使用數(shù)據(jù)庫的過程中,我們往往使用數(shù)據(jù)庫連接池而不是直接使用數(shù)據(jù)庫連接進行操作,這是因為每一個數(shù)據(jù)庫連接的創(chuàng)建和銷毀的代價是昂貴的,而池化技術(shù)則預(yù)先創(chuàng)建了資源,這些資源是可復(fù)用的這樣就保證了在多用戶情況下只能使用指定數(shù)目的資 池化技術(shù)簡介 在我們使用數(shù)據(jù)庫的過程中,我們往往使用數(shù)據(jù)庫連接池而不是直接使用數(shù)據(jù)庫連接進行操作,這是因為每一個數(shù)據(jù)庫連接的創(chuàng)建和銷毀的代價是昂貴...
摘要:顧名思義,是類型的線程安全原子類,可以在應(yīng)用程序中以原子的方式更新值。創(chuàng)建對象先來看下對象的創(chuàng)建。也就是說當一個線程修改一個共享變量時,其它線程能立即讀到這個修改的值。 showImg(https://segmentfault.com/img/remote/1460000016012210); 本文首發(fā)于一世流云的專欄:https://segmentfault.com/blog... ...
閱讀 2016·2021-11-12 10:36
閱讀 1866·2021-11-09 09:49
閱讀 2593·2021-11-04 16:12
閱讀 1144·2021-10-09 09:57
閱讀 3235·2019-08-29 17:24
閱讀 1909·2019-08-29 15:12
閱讀 1272·2019-08-29 14:07
閱讀 1286·2019-08-29 12:53