JAVA鎖

樂觀鎖

樂觀鎖是一種樂觀思想,即認(rèn)為讀多寫少,遇到并發(fā)寫的可能性低,每次去拿數(shù)據(jù)的時(shí)候都認(rèn)為別人不會(huì)修改,所以不會(huì)上鎖,但是在更新的時(shí)候會(huì)判斷一下在此期間別人有沒有去更新這個(gè)數(shù)據(jù),采取在寫時(shí)先讀出當(dāng)前版本號(hào),然后加鎖操作(比較跟上一次的版本號(hào),如果一樣則更新), 如果失敗則要重復(fù)讀-比較-寫的操作。
java 中的樂觀鎖基本都是通過 CAS操作實(shí)現(xiàn)的,CAS 是一種更新的原子操作,比較當(dāng)前值跟傳入值是否一樣,一樣則更新,否則失敗。

悲觀鎖

悲觀鎖是就是悲觀思想,即認(rèn)為寫多,遇到并發(fā)寫的可能性高,每次去拿數(shù)據(jù)的時(shí)候都認(rèn)為別人 會(huì)修改,所以每次在讀寫數(shù)據(jù)的時(shí)候都會(huì)上鎖,這樣別人想讀寫這個(gè)數(shù)據(jù)就會(huì)block直到拿到鎖。 java中的悲觀鎖就是Synchronized,AQS框架下的鎖則是先嘗試cas樂觀鎖去獲取鎖,獲取不到, 才會(huì)轉(zhuǎn)換為悲觀鎖,如RetreenLock。

自旋鎖

如果持有鎖的線程能在很短時(shí)間內(nèi)釋放鎖資源,那么那些等待競(jìng)爭(zhēng)鎖 的線程就不需要做內(nèi)核態(tài)和用戶態(tài)之間的切換進(jìn)入阻塞掛起狀態(tài),它們只需要等一等(自旋), 等持有鎖的線程釋放鎖后即可立即獲取鎖,這樣就避免用戶線程和內(nèi)核的切換的消耗。
線程自旋是需要消耗 cup 的,說白了就是讓 cup 在做無用功,如果一直獲取不到鎖,那線程也不能一直占用cup自旋做無用功,所以需要設(shè)定一個(gè)自旋等待的最大時(shí)間。
如果持有鎖的線程執(zhí)行的時(shí)間超過自旋等待的最大時(shí)間扔沒有釋放鎖,就會(huì)導(dǎo)致其它爭(zhēng)用鎖的線程在最大等待時(shí)間內(nèi)還是獲取不到鎖,這時(shí)爭(zhēng)用線程會(huì)停止自旋進(jìn)入阻塞狀態(tài)。

?著作權(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)容

  • 在并發(fā)編程中,各種鎖起著至關(guān)重要的作用,但是什么情景下使用什么鎖,就需要好好考慮一下,如使用不當(dāng),輕則程序運(yùn)行效率...
    架構(gòu)師修練手冊(cè)閱讀 639評(píng)論 0 2
  • 1、概述 在并發(fā)編程中,經(jīng)常遇到多個(gè)線程訪問同一個(gè)共享資源 ,這時(shí)候作為開發(fā)者必須考慮如何維護(hù)數(shù)據(jù)一致性,在jav...
    高丕基閱讀 1,165評(píng)論 0 15
  • 原文作者:拉夫德爾原文地址:原文鏈接摘抄申明:我們不占有不侵權(quán),我們只是好文的搬運(yùn)工!轉(zhuǎn)發(fā)請(qǐng)帶上原文申明。 樂觀鎖...
    Hey_Shaw閱讀 680評(píng)論 0 1
  • 鎖大概有以下名詞:自旋鎖,自旋鎖的其他種類,阻塞鎖,可重入鎖,讀寫鎖,互斥鎖,悲觀鎖,樂觀鎖,公平鎖,偏向鎖,對(duì)象...
    放開那個(gè)BUG閱讀 3,597評(píng)論 0 3
  • 場(chǎng)景 當(dāng)多個(gè)請(qǐng)求同時(shí)操作數(shù)據(jù)庫的時(shí)候,首先將訂單狀態(tài)改為已支付,在對(duì)應(yīng)的金額上加上200,在同事并發(fā)場(chǎng)景查詢條件會(huì)...
    s_j_x閱讀 2,298評(píng)論 0 0

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