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