一运翼、CAS簡介
CAS:Compare and Swap, 翻譯成比較并交換又活。
java.util.concurrent包中借助CAS實現(xiàn)了區(qū)別于synchronouse同步鎖的一種樂觀鎖舌仍,使用這些類在多核CPU的機(jī)器上會有比較好的性能.
CAS有3個操作數(shù)洋闽,內(nèi)存值V,舊的預(yù)期值A(chǔ),要修改的新值B。當(dāng)且僅當(dāng)預(yù)期值A(chǔ)和內(nèi)存值V相同時,將內(nèi)存值V修改為B秩铆,否則什么都不做。
今天我們主要是針對AtomicInteger的incrementAndGet做深入分析灯变。
二殴玛、JAVA實現(xiàn)部分
循環(huán)的內(nèi)容是
1.取得當(dāng)前值
2.計算+1后的值
3.如果當(dāng)前值沒有被覆蓋的話設(shè)置那個+1后的值
4.如果設(shè)置沒成功, 再從1開始
在這個方法中可以看到compareAndSet這個方法,我們進(jìn)入看一下柒凉。
調(diào)用UnSafe這個類的compareAndSwapInt
JAVA程序也就跟蹤到這里為止了族阅,剩下的就是通過JNI調(diào)用C程序了,可是我奇怪的是為什么變量名都是var1膝捞,var2這樣的命名呢坦刀?JAVA編程規(guī)范不是說不使用1愧沟,2等沒有含義的字符命名嗎?
三鲤遥、JNI原生實現(xiàn)部分
在openJDK中找到找到unsafe.cpp這個文件沐寺,代碼如下:
核心方法是compxchg,這個方法所屬的類文件是在OS_CPU目錄下面盖奈,由此可以看出這個類是和CPU操作有關(guān)混坞,進(jìn)入代碼如下:
這個方法里面都是匯編指命,看到LOCK_IF_MP也有鎖指令實現(xiàn)的原子操作钢坦,其實CAS也算是有鎖操作究孕,只不過是由CPU來觸發(fā),比synchronized性能好的多爹凹。
原文如下:http://flychao88.iteye.com/blog/2269438