<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          面試必備:聊聊互斥鎖、自旋鎖、讀寫鎖、悲觀鎖、樂(lè)觀鎖使用場(chǎng)景

          共 1583字,需瀏覽 4分鐘

           ·

          2021-11-04 00:29

          ?先來(lái)聊聊為啥加鎖,多線程訪問(wèn)共享資源的時(shí)候,為了避免資源競(jìng)爭(zhēng)而導(dǎo)致數(shù)據(jù)錯(cuò)亂,會(huì)在訪問(wèn)共享資源之前加鎖,加鎖的目的是保證共享資源在任意時(shí)間里,只有一個(gè)線程訪問(wèn)。鎖又分為互斥鎖、自旋鎖、讀寫鎖、悲觀鎖、樂(lè)觀鎖,下面分別介紹使用場(chǎng)景。

          ? 1、互斥鎖

          ? 互斥鎖是一種【獨(dú)占鎖】,當(dāng)線程A加鎖成功后,此時(shí)互斥鎖已經(jīng)被線程A獨(dú)占了,只要線程A沒(méi)有釋放手中的鎖,線程B加鎖就會(huì)失敗,于是就會(huì)釋放CPU讓給其他線程,既然線程B釋放掉了CPU,自然線程B加鎖的代碼就會(huì)被阻塞。

          2、自旋鎖

          自旋鎖是通過(guò)CPU提供的CAS函數(shù)(Compare And Swap),在【用戶態(tài)】完成加鎖和解鎖操作,不會(huì)主動(dòng)產(chǎn)生線程上下文切換,所以相比互斥鎖來(lái)說(shuō),會(huì)快一些,開銷也小一些。比較簡(jiǎn)單的一種鎖,一直自旋,利用CPU周期,直到鎖可用。需要注意,在單核CPU上,需要搶占式的調(diào)度器(即不斷通過(guò)時(shí)鐘中斷一個(gè)線程,運(yùn)行其他線程)。否則,自旋鎖在單CPU上無(wú)法使用,因?yàn)橐粋€(gè)自旋的線程永遠(yuǎn)不會(huì)放棄CPU。


          3、讀寫鎖

          讀寫鎖從字面意思我們也可以知道,它由【讀鎖】和【寫鎖】?jī)刹糠謽?gòu)成,如果只讀取共享資源用【讀鎖】加鎖,如果要修改共享資源則用【寫鎖】加鎖。所以,讀寫鎖適用于能明確區(qū)分讀操作和寫操作的場(chǎng)景。

          ?工作原理:當(dāng)【寫鎖】沒(méi)有被線程持有時(shí),多個(gè)線程能夠并發(fā)地持有讀鎖,這大大提高了共享資源的訪問(wèn)效率,因?yàn)椤咀x鎖】是用于讀取共享資源的場(chǎng)景,所以多個(gè)線程同時(shí)持有讀鎖也不會(huì)破壞共享資源的數(shù)據(jù)。

          ? ? ? 但是,一旦【寫鎖】被線程持有后,讀線程的獲取讀鎖的操作會(huì)被阻塞,而且其他寫線程的獲取寫鎖的操作也會(huì)被阻塞。

          所以說(shuō),寫鎖是獨(dú)占鎖,因?yàn)槿魏螘r(shí)刻只能有一個(gè)線程持有寫鎖,類似互斥鎖和自旋鎖,而讀鎖是共享鎖,因?yàn)樽x鎖可以被多個(gè)線程同時(shí)持有。


          根據(jù)實(shí)現(xiàn)的不同,讀寫鎖可以分為【讀優(yōu)先鎖】和【寫優(yōu)先鎖】。

          讀優(yōu)先鎖期望的是,讀鎖能被更多的線程持有,以便提高讀線程的并發(fā)性,它的工作方式是:當(dāng)讀線程A先持有了讀鎖,寫線程B在獲取寫鎖的時(shí)候,會(huì)被阻塞,并且在阻塞過(guò)程中,后續(xù)來(lái)的讀線程C仍然可以成功獲取讀鎖,最后直到讀線程A和C釋放讀鎖后,寫線程B才可以成功獲取讀鎖。

          而寫優(yōu)先鎖是優(yōu)先服務(wù)寫線程,其工作方式是:當(dāng)讀線程A先持有了讀鎖,寫線程B在獲取寫鎖的時(shí)候,會(huì)被阻塞,并且在阻塞過(guò)程中,后續(xù)來(lái)的讀線程C獲取讀鎖時(shí)會(huì)失敗,于是讀線程C將被阻塞在獲取讀鎖的操作,這樣只有讀線程A釋放讀鎖后,寫線程B就可以成功獲取讀鎖。

          讀寫鎖適用于能明確區(qū)分讀操作和寫操作的場(chǎng)景

          4、樂(lè)觀鎖和悲觀鎖


          前面提到的互斥鎖、自旋鎖、讀寫鎖,都是屬于悲觀鎖。悲觀鎖認(rèn)為多線程同時(shí)修改共享資源的概率比較高,于是很容易出現(xiàn)沖突,所以訪問(wèn)共享資源前,先要上鎖。

          樂(lè)觀鎖認(rèn)為多線程同時(shí)修改共享資源的概率比較低,它的工作方式是:先修改完共享資源,再驗(yàn)證這段時(shí)間內(nèi)有沒(méi)有發(fā)生沖突,如果沒(méi)有 其他線程在修改資源,那么操作完成,如果發(fā)現(xiàn)有其他線程已經(jīng)修改過(guò)這個(gè)資源,就放棄本次操作。

          樂(lè)觀鎖雖然去除了加鎖解鎖的操作,但是一旦發(fā)生沖突,重試的成本非常高,所以只有在沖突概率非常低,且加鎖成本非常高的場(chǎng)景時(shí),才考慮使用樂(lè)觀鎖。


          參考:

          https://www.cnblogs.com/everydaystarting123/p/13959630.html


          版權(quán)申明:本文來(lái)源于網(wǎng)友收集或網(wǎng)友提供,僅供學(xué)習(xí)交流之用,如果有侵權(quán),請(qǐng)轉(zhuǎn)告版主或者留言,本公眾號(hào)立即刪除。


          支持小微:

          騰訊云 雙十一活動(dòng)!玩服務(wù)器的可以搞搞!

          輕量服務(wù)器??1C2G5M 50GB SSD盤?50元起

          鏈接:https://curl.qcloud.com/bR8ycXZa


          右下角,您點(diǎn)一下在看圖片2f6310d55640b6da95c7dbfd9bea0bad.webp

          小微工資漲1毛

          商務(wù)合作QQ:185601686



          瀏覽 35
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  久草大| 亚洲无在线 | 操逼无码电影 | 天天草婷婷蕉蕉操 | 视频四区在线播放 |