2020-11-16-鎖

編程中鎖的分類:互斥鎖、自旋鎖、讀寫鎖、悲觀鎖、樂觀鎖;
開發(fā)過程中,最常見的就是互斥鎖的了,互斥鎖加鎖失敗時(shí),會(huì)用「線程切換」來應(yīng)對(duì),當(dāng)加鎖失敗的線程再次加鎖成功后的這一過程,會(huì)有兩次線程上下文切換的成本,性能損耗比較大。

如果我們明確知道被鎖住的代碼的執(zhí)行時(shí)間很短,那我們應(yīng)該選擇開銷比較小的自旋鎖,因?yàn)樽孕i加鎖失敗時(shí),并不會(huì)主動(dòng)產(chǎn)生線程切換,而是一直忙等待,直到獲取到鎖,那么如果被鎖住的代碼執(zhí)行時(shí)間很短,那這個(gè)忙等待的時(shí)間相對(duì)應(yīng)也很短。

如果能區(qū)分讀操作和寫操作的場(chǎng)景,那讀寫鎖就更合適了,它允許多個(gè)讀線程可以同時(shí)持有讀鎖,提高了讀的并發(fā)性。根據(jù)偏袒讀方還是寫方,可以分為讀優(yōu)先鎖和寫優(yōu)先鎖,讀優(yōu)先鎖并發(fā)性很強(qiáng),但是寫線程會(huì)被餓死,而寫優(yōu)先鎖會(huì)優(yōu)先服務(wù)寫線程,讀線程也可能會(huì)被餓死,那為了避免饑餓的問題,于是就有了公平讀寫鎖,它是用隊(duì)列把請(qǐng)求鎖的線程排隊(duì),并保證先入先出的原則來對(duì)線程加鎖,這樣便保證了某種線程不會(huì)被餓死,通用性也更好點(diǎn)。

互斥鎖和自旋鎖都是最基本的鎖,讀寫鎖可以根據(jù)場(chǎng)景來選擇這兩種鎖其中的一個(gè)進(jìn)行實(shí)現(xiàn)。

另外,互斥鎖、自旋鎖、讀寫鎖都屬于悲觀鎖,悲觀鎖認(rèn)為并發(fā)訪問共享資源時(shí),沖突概率可能非常高,所以在訪問共享資源前,都需要先加鎖。

相反的,如果并發(fā)訪問共享資源時(shí),沖突概率非常低的話,就可以使用樂觀鎖,它的工作方式是,在訪問共享資源時(shí),不用先加鎖,修改完共享資源后,再驗(yàn)證這段時(shí)間內(nèi)有沒有發(fā)生沖突,如果沒有其他線程在修改資源,那么操作完成,如果發(fā)現(xiàn)有其他線程已經(jīng)修改過這個(gè)資源,就放棄本次操作。

但是,一旦沖突概率上升,就不適合使用樂觀鎖了,因?yàn)樗鉀Q沖突的重試成本非常高。

不管使用的哪種鎖,我們的加鎖的代碼范圍應(yīng)該盡可能的小,也就是加鎖的粒度要小,這樣執(zhí)行速度會(huì)比較快。再來,使用上了合適的鎖,就會(huì)快上加快了。

?著作權(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)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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