金閶公司網(wǎng)站建設(shè)電話優(yōu)化排名推廣關(guān)鍵詞
CAS是一種樂觀鎖機制,一種比較并交換的過程和理念,用來解決線程安全問題,具體來講就是對共享變量值的安全更新機制。能夠保證原子、可見、一致性。這種交換過程是在Unsafe類中實現(xiàn)。
從一段簡單的代碼開始來對源碼做分析
public static void main(String[] args) {AtomicInteger ai = new AtomicInteger(0);ai.getAndAdd(1);System.out.println(ai.get());//打印對象ai的內(nèi)存結(jié)構(gòu),需要引入jol-core工具包ClassLayout classLayout = ClassLayout.parseInstance(ai);System.out.println(classLayout.toPrintable());}
從 new AtomicInteger(0) 進(jìn)入先看構(gòu)造方法和靜態(tài)代碼塊,再看ai.getAndAdd(1)做了什么。
public class AtomicInteger extends Number implements java.io.Serializable {...private static final long valueOffset;static {try {//獲取初始值value的內(nèi)存偏移量,這個偏移量指的是變量相對于對象地址的偏移,通過此偏移可以獲取變量在內(nèi)存中的值,后面還會介紹valueOffset = unsafe.objectFieldOffset(AtomicInteger.class.getDeclaredField("value"));} catch (Exception ex) { throw new Error(ex); }}//初始化的時候給value賦值public AtomicInteger(int initialValue) {value = initialValue;}//比較并交換的具體實現(xiàn),需要進(jìn)入到Unsafe類中public final int getAndAdd(int delta) {//this-當(dāng)前atomicInter對象;valueoffest-內(nèi)存偏移量;delta需要增加的值return unsafe.getAndAddInt(this, valueOffset, delta);}
}
?進(jìn)入到Unsafe.getAndAddInt方法中
public final class Unsafe {...public final int getAndAddInt(Object var1, long var2, int var4) {int var5;do {//通過AtomicInteger對象和其變量value的偏移量獲取內(nèi)存中的value值,這里var5對其他線程 是可見的, 如果不可見,那么這個值的獲取就可能非內(nèi)存真實值。如果var5 = this.getIntVolatile(var1, var2);//compareAndSwapInt的過程是原子性的,將重新獲取到的內(nèi)存value值與var5比較,true則說明value的內(nèi)存值并未被修改,可以將原值var5 + 增值var4。} while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4));return var5;}
}
通過斷點看具體的值
?再來看偏移量是什么,下面是AtomicInteger類型對象ai的內(nèi)存結(jié)構(gòu)
java.util.concurrent.atomic.AtomicInteger object internals:OFFSET SIZE TYPE DESCRIPTION VALUE0 4 (object header) 01 00 00 00 (00000001 00000000 00000000 00000000) (1)4 4 (object header) 00 00 00 00 (00000000 00000000 00000000 00000000) (0)8 4 (object header) bd 3d 00 f8 (10111101 00111101 00000000 11111000) (-134201923)12 4 int AtomicInteger.value 1
Instance size: 16 bytes
Space losses: 0 bytes internal + 0 bytes external = 0 bytes total
請看標(biāo)紅的位置,由于對象的分配是在一個地址段內(nèi),對象中變量就是基于對象初始地址作了偏移,這里是對象中value變量相對對象初始地址的位置,其值最終為1。
個人理解,有不對之處,望請指正,謝謝。