一張圖讀懂非公平鎖與公平鎖
線程的掛起
線程的掛起操作實質上就是線程進入"非可執行"狀態下,在這個狀態下CPU不會分給線程時間片,進入這個狀態可以用來暫停一個線程的運行。 線程掛起后,可以通過重新喚醒線程來使之恢復運行。
cpu分配的線程片非常的短、同時也非常珍貴。線程的掛起可以避免資源的浪費。
掛起線程的方法?
1、廢棄的方法
thread.suspend():該方法不會釋放線程所暫用的資源。如果使用該方法將某個線程掛起,可能會使其他等待資源的線程死鎖。
thread.resume():方法本身沒有問題,但是不能獨立於suspend()方法使用
2、日常使用的方法
wait() 暫停執行、放棄已獲得的鎖、進入等待狀態
niotify() 隨機喚醒一個在等待鎖的線程
notifyAll() 喚醒所有在等待鎖的線程,自行搶占cpu
什么時候使用掛起線程
- 線程等待某些未就緒的資源時,先釋放當前鎖,避免資源浪費,等待的資源就緒后調用notify方法喚醒線程。
公平鎖與非公平鎖效率差異原因
公平鎖要維護一個隊列,后來的線程要加鎖,即使鎖空閑,也要先檢查有沒有其他線程在 wait,如果有自己要掛起,加到隊列后面,然后喚醒隊列最前面的線程。這種情況下相比較非公平鎖多了一次掛起和喚醒
線程切換的開銷,其實就是非公平鎖效率高於公平鎖的原因,因為非公平鎖減少了線程掛起的幾率,后來的線程有一定幾率逃離被掛起的開銷。