【死記硬背】
CAS英文是Compare And Swap/Set,即比較并交換。
CAS得實(shí)現(xiàn)原理:它包含3個(gè)參數(shù) CAS(V,E,N)。V 表示要更新得變量(內(nèi)存值),E表示預(yù)期值(舊得),N表示新值。如果內(nèi)存位置V得值與預(yù)期原值E相匹配,那么處理器會(huì)自動(dòng)將該位置值更新為新值N,返回true。否則處理器不做任何操作,返回false。
CAS得缺點(diǎn):只能保證對(duì)一個(gè)變量得原子性操作,長(zhǎng)時(shí)間自旋會(huì)給CPU帶來(lái)壓力,可能會(huì)存在ABA問題。
什么是ABA問題:
CAS實(shí)現(xiàn)一個(gè)重要前提需要取出內(nèi)存中某時(shí)刻得數(shù)據(jù),而在下一時(shí)刻比較并替換,那么在這個(gè)時(shí)間差類會(huì)導(dǎo)致數(shù)據(jù)得變化。比如說(shuō)一個(gè)線程one從內(nèi)存位置V中取出A,這時(shí)候另一個(gè)線程two也從內(nèi)存中取出A,并且two進(jìn)行了一些操作變成了B,然后 two又將V位置得數(shù)據(jù)變成 A,這時(shí)候線程one進(jìn)行CAS操作發(fā)現(xiàn)內(nèi)存中仍然是A,然后 one 操作成功。盡管線程one 得 CAS操作成功,但是不代表這個(gè)過(guò)程就是沒有問題得。部分樂觀鎖得實(shí)現(xiàn)是通過(guò)版本號(hào)(version)得方式來(lái)解決ABA問題,樂觀鎖每次在執(zhí)行數(shù)據(jù)得修改操作時(shí),都會(huì)帶上一個(gè)版本號(hào),一旦版本號(hào)和數(shù)據(jù)得版本號(hào)一致就可以執(zhí)行修改操作并對(duì)版本號(hào)執(zhí)行+1 操作,否則就會(huì)失敗。因?yàn)槊看尾僮鞯冒姹咎?hào)都會(huì)隨之增加,所以不會(huì)出現(xiàn)ABA問題,因?yàn)榘姹咎?hào)只會(huì)增加不會(huì)減少。
【答案解析】
AtomicInteger類中有CAS得使用,樣例代碼如下:
import java.util.concurrent.atomic.AtomicInteger;public class CASTest { public static void main(String[] args) { // 創(chuàng)建一個(gè)原子類 AtomicInteger atomicInteger = new AtomicInteger(5); System.out.println(atomicInteger感謝原創(chuàng)分享者pareAndSet(5, 前年) + "\t current data: " + atomicInteger.get()); System.out.println(atomicInteger感謝原創(chuàng)分享者pareAndSet(5, 1024) + "\t current data: " + atomicInteger.get()); }}
【溫馨提示】
點(diǎn)贊+收藏文章,感謝對(duì)創(chuàng)作者的支持我并私信回復(fù)【面試題解析】,即可百分百免費(fèi)領(lǐng)取樓主得所有面試題資料!