面试必备:CAS无锁机制
CAS無(wú)鎖機(jī)制原理,面試高頻問(wèn)題之一,其實(shí),日常開(kāi)發(fā)中并不會(huì)直接使用CAS無(wú)鎖機(jī)制,都是通過(guò)一系列封裝好的工具類來(lái)使用,
說(shuō)不定面試官不提問(wèn),都不知道有這么個(gè)東西存在。
1、能說(shuō)一下你對(duì)CAS的理解嗎?
參考回答:
通常我們提到保證多線程安全,會(huì)想到三種方式,一是使用Synchronize關(guān)鍵字,但是有個(gè)問(wèn)題就是,使用了Synchronize加鎖后的多線程相當(dāng)于串行,執(zhí)行效率并不是太高,所以在高并發(fā)場(chǎng)景下,使用第二種方式Lock鎖,Lock鎖要比使用Synchronize關(guān)鍵字在性能上有極大的提高,其實(shí)Lock鎖底層就是通過(guò)AQS+CAS機(jī)制實(shí)現(xiàn)的;第三種方式就是使用Java并發(fā)包下的Atomic「e淘米客」原子操作類,使用了原子類后就不需要使用Synchronize關(guān)鍵字或者是Lock加鎖也是線程安全的,原子類的底層就是基于CAS無(wú)鎖算法實(shí)現(xiàn)的。
CAS 比較后再交換。CAS有三個(gè)操作數(shù),舊值A(chǔ),新值B,以及需要讀取的內(nèi)存值V,在更新一個(gè)變量時(shí),當(dāng)且僅當(dāng)A=V相同時(shí),CAS才會(huì)將內(nèi)存值V修改為B,否則什么都不做。
參考回答有點(diǎn)啰嗦了,提到了CAS的應(yīng)用場(chǎng)景原子類的使用,但多說(shuō)點(diǎn)顯得有丶東西
2、能說(shuō)一下CAS的實(shí)現(xiàn)原理嗎?
參考回答
Java里的CAS是通過(guò)調(diào)用Unsafe「安sei夫」類的native方法,再由C調(diào)用CPU底層命令實(shí)現(xiàn)的。
如果問(wèn)到Unsafe?
Unsafe 這個(gè)類是 JDK 提供的一個(gè)比較底層的類,是一個(gè)不安全的類,官方不建議開(kāi)發(fā)者使用的,為啥呢?①Unsafe在未來(lái)可能被移除,也就是高版本jdk可能無(wú)法運(yùn)行;②Unsafe中不少方法中必須提供內(nèi)存地址和被替換對(duì)象的地址,中間會(huì)有一些計(jì)算問(wèn)題,一旦出現(xiàn)問(wèn)題就會(huì)導(dǎo)致jvm實(shí)例崩潰;③Unsafe中提供的直接訪問(wèn)內(nèi)存的方法不受jvm管理,需要手動(dòng)操作,如果疏忽可能會(huì)觸發(fā)內(nèi)存泄漏;
Unsafe通常用來(lái):「額外補(bǔ)充,了解即可」
- 內(nèi)存管理:包括分配內(nèi)存、釋放內(nèi)存
- 操作類、對(duì)象、變量:通過(guò)獲取對(duì)象和變量偏移量直接修改數(shù)據(jù)
- 掛起與恢復(fù):將線程阻塞或者恢復(fù)阻塞狀態(tài)
- CAS:調(diào)用 CPU 的 CAS 指令進(jìn)行比較和交換
- 內(nèi)存屏障:定義內(nèi)存屏障,避免指令重排序
如果你想了解加深CAS原理,那么可以敲出一個(gè)原子類變量,比如AtomicInteger,直接看一下他的源碼,找一下Unsafe是怎么大量應(yīng)用的。
3、能說(shuō)一下CAS的優(yōu)缺點(diǎn)?
缺點(diǎn)
在并發(fā)量比較高的情況下,如果線程反復(fù)嘗試更新一個(gè)變量,卻又一直更新不成功,循環(huán)往復(fù),會(huì)給CPU帶來(lái)很大的壓力。
只能是一個(gè)變量的原子操作,無(wú)法確保整個(gè)代碼塊的原子性,也就是在需要保證2個(gè)及以上變量共同進(jìn)行原子性的更新時(shí),就不得不使用Synchronized了
假設(shè)有一個(gè)變量 A ,經(jīng)修改后變?yōu)锽,然后又修改為 A,實(shí)際已經(jīng)修改過(guò)了,但 CAS 可能無(wú)法感知,造成了不合理的值修改操作。
解決方案是:使用版本號(hào),在變量前面追加上版本號(hào),每次變量更新的時(shí)候把版本號(hào)加一,那么A-B-A 就會(huì)變成1A-2B-3A
*優(yōu)點(diǎn)
在一般情況下,性能優(yōu)先于鎖的使用。
4、最后補(bǔ)充
從思想上來(lái)說(shuō),Synchronized屬于悲觀鎖,悲觀地認(rèn)為程序中的并發(fā)情況嚴(yán)重,所以嚴(yán)防死守。
CAS屬于樂(lè)觀鎖,樂(lè)觀地認(rèn)為程序中的并發(fā)情況不那么嚴(yán)重,所以讓線程不斷去嘗試更新。
CAS和Synchronized沒(méi)有絕對(duì)的好與壞,關(guān)鍵看使用場(chǎng)景。在并發(fā)量非常高的情況下,反而用同步鎖更合適一些。
?
總結(jié)
以上是生活随笔為你收集整理的面试必备:CAS无锁机制的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Windows下【AxureRP】原型设
- 下一篇: 浅谈分布式锁