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