如果面試官問(wèn)你CAS的理解,首先要確定是他問(wèn)的是“原子操作”還是“單點(diǎn)登錄”。因?yàn)樵谄髽I(yè)應(yīng)用中CAS也被稱(chēng)為企業(yè)級(jí)開(kāi)源單點(diǎn)登錄解決方案,是 Central Authentication Service 的縮寫(xiě) —— 中央認(rèn)證服務(wù),一種獨(dú)立開(kāi)放指令協(xié)議,是 Yale 大學(xué)發(fā)起的一個(gè)企業(yè)級(jí)開(kāi)源項(xiàng)目,旨在為 Web 應(yīng)用系統(tǒng)提供一種可靠的 SSO 解決方案。
一般問(wèn)的是“原子操作”。CAS(Compare And Swap):原子,也是最小單位,是一個(gè)不可再分割的單位,不可被中斷的一個(gè)或者一系列操作。CAS是以一種無(wú)鎖的方式實(shí)現(xiàn)并發(fā)控制,在實(shí)際情況下,同時(shí)操作一個(gè)對(duì)象的概率非常小,所以多數(shù)加鎖操作做的基本是無(wú)用功。CAS以一種樂(lè)觀鎖的方式實(shí)現(xiàn)并發(fā)控制。
Sync是基于阻塞的鎖機(jī)制。它的特點(diǎn)和缺點(diǎn):1.被阻塞的線(xiàn)程優(yōu)先級(jí)很高;2.拿到鎖的線(xiàn)程一直不釋放鎖則么辦; 3.大量的競(jìng)爭(zhēng),消耗CPU,同時(shí)帶來(lái)死鎖或者其他線(xiàn)程安全。鑒于以上問(wèn)題,使用CAS比較高效。
java中實(shí)現(xiàn)原子操作通過(guò)鎖和循環(huán)CAS的方式實(shí)現(xiàn)原子操作。CAS就是比較并且替換的一個(gè)原子操作,在CPU的指令級(jí)別上進(jìn)行保證。參數(shù)包含:一個(gè)內(nèi)存地址V,一個(gè)期望的值A(chǔ),一個(gè)新值B。
基本思路: 如果地址V上的值和期望的值A(chǔ)相等,就給地址V賦值新值B,如果不是,不做任何操作。
循環(huán)CAS:在一個(gè)(死)循環(huán)中[for(;;)]里不斷進(jìn)行CAS操作,直到成功為止(自旋操作即死循環(huán))。
CAS問(wèn)題:
ABA問(wèn)題:那么什么是ABA問(wèn)題?就是內(nèi)存中原本是A,然后通過(guò)CAS變成了B,然后再次通過(guò)CAS變成了A,這個(gè)過(guò)程中,相對(duì)于結(jié)果來(lái)說(shuō),是沒(méi)有任何改變的,但是相對(duì)于內(nèi)存來(lái)說(shuō),至少發(fā)生過(guò)兩次變化,這就是ABA問(wèn)題。從Java1.5開(kāi)始JDK的atomic包里提供了一個(gè)類(lèi)AtomicStampedReference來(lái)解決ABA問(wèn)題。
開(kāi)銷(xiāo)問(wèn)題:
在自旋或者死循環(huán)中不斷進(jìn)行CAS操作,但是長(zhǎng)期操作不成功,CPU不斷的循環(huán),帶來(lái)的開(kāi)銷(xiāo)問(wèn)題。解決:CPU提供pause指令。
CAS的目的:
利用CPU的CAS指令,同時(shí)借助JNI來(lái)完成Java的非阻塞算法。其它原子操作都是利用類(lèi)似的特性完成的。而整個(gè)J.U.C都是建立在CAS之上的,因此對(duì)于synchronized阻塞算法,J.U.C在性能上有了很大的提升。
參考鏈接:https://www.cnblogs.com/flower-dance/p/13767956.html