面試必備:聊聊互斥鎖、自旋鎖、讀寫鎖、悲觀鎖、樂(lè)觀鎖使用場(chǎng)景
?先來(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)一下在看圖片
小微工資漲1毛
商務(wù)合作QQ:185601686
