自旋鎖、阻塞鎖、重入鎖、偏向鎖、輕量鎖和重量鎖


1、自旋鎖:

采用讓當前線程不停的在循環體內執行實現,當循環的條件被其它線程改變時才能進入臨界區

舉例如下:

 

 

 

優缺點分析:

由於自旋鎖只是將當前線程不停地執行循環體,不進行線程狀態的改變,所以響應速度更快。但當線程數不停增加時,性能下降明顯,因為每個線程都需要執行,占用CPU時間。如果線程競爭不激烈,並且保持鎖的時間段。適合使用自旋鎖。

 

大家可以點擊加群【JAVA架構知識學習討論群】473984645,(如多你想跳槽換工作,但是技術又不夠,或者工作遇到了瓶頸,我這里有一個Java的免費直播課程,講的是高端的知識點,只要有1-5年的開發工作經驗可以加群找我要課堂鏈接。)注意:是免費的  沒有開發經驗的誤入。

 

2、阻塞鎖: 阻塞鎖改變了線程的運行狀態,讓線程進入阻塞狀態進行等待,當獲得相應的信號(喚醒或者時間)時,才可以進入線程的准備就緒狀態,轉為就緒狀態的所有線程,通過競爭,進入運行狀態。

優缺點分析: 阻塞鎖的優勢在於,阻塞的線程不會占用cpu時間,不會導致 CPu占用率過高,但進入時間以及恢復時間都要比自旋鎖略慢。在競爭激烈的情況下 阻塞鎖的性能要明顯高於自旋鎖。

 

3、重入鎖: Java中的synchronized同步塊是可重入的。這意味着如果一個java線程進入了代碼中的synchronized同步塊,並因此獲得了該同步塊使用的同步對象對應的管程上的鎖,那么這個線程可以進入由同一個管程對象所同步的另一個java代碼塊。

 

 ReentrantLock與synchronized比較:

1.前者使用靈活,但是必須手動開啟和釋放鎖

2.前者擴展性好,有時間鎖等候(tryLock( )),可中斷鎖等候(lockInterruptibly( )),鎖投票等,適合用於高度競爭鎖和多個條件變量的地方

3.前者提供了可輪詢的鎖請求,可以嘗試去獲取鎖(tryLock( )),如果失敗,則會釋放已經獲得的鎖。有完善的錯誤恢復機制,可以避免死鎖的發生。

優缺點分析: 可重入鎖的最大優點就是可以避免死鎖。缺點是必須手動開啟和釋放鎖。

偏向鎖、輕量鎖和重量鎖的優缺點總結如下:

 

我這兒整理了比較全面的JAVA相關的面試資料,


需要領取面試資料的同學,請加群:473984645

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM