公平鎖與非公平鎖+效率差異原因


一張圖讀懂非公平鎖與公平鎖

線程的掛起

線程的掛起操作實質上就是線程進入"非可執行"狀態下,在這個狀態下CPU不會分給線程時間片,進入這個狀態可以用來暫停一個線程的運行。 線程掛起后,可以通過重新喚醒線程來使之恢復運行。

cpu分配的線程片非常的短、同時也非常珍貴。線程的掛起可以避免資源的浪費。

掛起線程的方法?

1、廢棄的方法

thread.suspend():該方法不會釋放線程所暫用的資源。如果使用該方法將某個線程掛起,可能會使其他等待資源的線程死鎖。

thread.resume():方法本身沒有問題,但是不能獨立於suspend()方法使用

2、日常使用的方法

wait() 暫停執行、放棄已獲得的鎖、進入等待狀態

niotify() 隨機喚醒一個在等待鎖的線程

notifyAll() 喚醒所有在等待鎖的線程,自行搶占cpu

什么時候使用掛起線程

  • 線程等待某些未就緒的資源時,先釋放當前鎖,避免資源浪費,等待的資源就緒后調用notify方法喚醒線程。

公平鎖與非公平鎖效率差異原因

公平鎖要維護一個隊列,后來的線程要加鎖,即使鎖空閑,也要先檢查有沒有其他線程在 wait,如果有自己要掛起,加到隊列后面,然后喚醒隊列最前面的線程。這種情況下相比較非公平鎖多了一次掛起和喚醒

線程切換的開銷,其實就是非公平鎖效率高於公平鎖的原因,因為非公平鎖減少了線程掛起的幾率,后來的線程有一定幾率逃離被掛起的開銷。


免責聲明!

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



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