日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

面试必备:CAS无锁机制

發(fā)布時(shí)間:2023/12/10 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 面试必备:CAS无锁机制 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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)

  • CPU開(kāi)銷比較大
    在并發(fā)量比較高的情況下,如果線程反復(fù)嘗試更新一個(gè)變量,卻又一直更新不成功,循環(huán)往復(fù),會(huì)給CPU帶來(lái)很大的壓力。
  • 只能保證一個(gè)共享變量的原子操作
    只能是一個(gè)變量的原子操作,無(wú)法確保整個(gè)代碼塊的原子性,也就是在需要保證2個(gè)及以上變量共同進(jìn)行原子性的更新時(shí),就不得不使用Synchronized了
  • ABA問(wèn)題
    假設(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)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。