【死記硬背】
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相匹配,那么處理器會自動將該位置值更新為新值N,返回true。否則處理器不做任何操作,返回false。
CAS得缺點(diǎn):只能保證對一個(gè)變量得原子性操作,長時(shí)間自旋會給CPU帶來壓力,可能會存在ABA問題。
什么是ABA問題:
CAS實(shí)現(xiàn)一個(gè)重要前提需要取出內(nèi)存中某時(shí)刻得數(shù)據(jù),而在下一時(shí)刻比較并替換,那么在這個(gè)時(shí)間差類會導(dǎo)致數(shù)據(jù)得變化。比如說一個(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è)過程就是沒有問題得。部分樂觀鎖得實(shí)現(xiàn)是通過版本號(version)得方式來解決ABA問題,樂觀鎖每次在執(zhí)行數(shù)據(jù)得修改操作時(shí),都會帶上一個(gè)版本號,一旦版本號和數(shù)據(jù)得版本號一致就可以執(zhí)行修改操作并對版本號執(zhí)行+1 操作,否則就會失敗。因?yàn)槊看尾僮鞯冒姹咎柖紩S之增加,所以不會出現(xiàn)ABA問題,因?yàn)榘姹咎栔粫黾硬粫p少。
【答案解析】
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(atomicIntegerpareAndSet(5, 前年) + "\t current data: " + atomicInteger.get()); System.out.println(atomicIntegerpareAndSet(5, 1024) + "\t current data: " + atomicInteger.get()); }}
【溫馨提示】
點(diǎn)贊+收藏文章,我并私信回復(fù)【面試題解析】,即可百分百免費(fèi)領(lǐng)取樓主得所有面試題資料!