金閶公司網(wǎng)站建設(shè)電話優(yōu)化排名推廣關(guān)鍵詞
CAS是一種樂(lè)觀鎖機(jī)制,一種比較并交換的過(guò)程和理念,用來(lái)解決線程安全問(wèn)題,具體來(lái)講就是對(duì)共享變量值的安全更新機(jī)制。能夠保證原子、可見(jiàn)、一致性。這種交換過(guò)程是在Unsafe類(lèi)中實(shí)現(xiàn)。
從一段簡(jiǎn)單的代碼開(kāi)始來(lái)對(duì)源碼做分析
public static void main(String[] args) {AtomicInteger ai = new AtomicInteger(0);ai.getAndAdd(1);System.out.println(ai.get());//打印對(duì)象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)存偏移量,這個(gè)偏移量指的是變量相對(duì)于對(duì)象地址的偏移,通過(guò)此偏移可以獲取變量在內(nèi)存中的值,后面還會(huì)介紹valueOffset = unsafe.objectFieldOffset(AtomicInteger.class.getDeclaredField("value"));} catch (Exception ex) { throw new Error(ex); }}//初始化的時(shí)候給value賦值public AtomicInteger(int initialValue) {value = initialValue;}//比較并交換的具體實(shí)現(xiàn),需要進(jìn)入到Unsafe類(lèi)中public final int getAndAdd(int delta) {//this-當(dāng)前atomicInter對(duì)象;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 {//通過(guò)AtomicInteger對(duì)象和其變量value的偏移量獲取內(nèi)存中的value值,這里var5對(duì)其他線程 是可見(jiàn)的, 如果不可見(jiàn),那么這個(gè)值的獲取就可能非內(nèi)存真實(shí)值。如果var5 = this.getIntVolatile(var1, var2);//compareAndSwapInt的過(guò)程是原子性的,將重新獲取到的內(nèi)存value值與var5比較,true則說(shuō)明value的內(nèi)存值并未被修改,可以將原值var5 + 增值var4。} while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4));return var5;}
}
通過(guò)斷點(diǎn)看具體的值
?再來(lái)看偏移量是什么,下面是AtomicInteger類(lèi)型對(duì)象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
請(qǐng)看標(biāo)紅的位置,由于對(duì)象的分配是在一個(gè)地址段內(nèi),對(duì)象中變量就是基于對(duì)象初始地址作了偏移,這里是對(duì)象中value變量相對(duì)對(duì)象初始地址的位置,其值最終為1。
個(gè)人理解,有不對(duì)之處,望請(qǐng)指正,謝謝。