CAS原子操作

如果面試官問(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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容