Thread釋放鎖和CPU

多線程中的wait與sleep到底誰釋放了鎖

首先,多線程中會使用到兩個延遲的函數,wait和sleep。
wait是Object類中的方法,而sleep是Thread類中的方法。

sleep是Thread類中的靜態方法。無論是在a線程中調用b的sleep方法,還是b線程中調用a的sleep方法,誰調用,誰睡覺。

最主要的是sleep方法調用之後,並沒有釋放鎖。使得線程仍然可以同步控制。sleep不會讓出系統資源;
而wait是進入線程等待池中等待,讓出系統資源。

調用wait方法的線程,不會自己喚醒,需要線程調用 notify / notifyAll 方法喚醒等待池中的所有線程,纔會進入就緒隊列中等待系統分配資源。sleep方法會自動喚醒,如果時間不到,想要喚醒,可以使用interrupt方法強行打斷。
Thread.sleep(0)   // 觸發操作系統立刻重新進行一次CPU競爭。

使用範圍:
sleep可以在任何地方使用。而wait,notify,notifyAll只能在同步控制方法或者同步控制塊中使用。

sleep必須捕獲異常,而wait,notify,notifyAll的不需要捕獲異常。

 

釋放CPU時間片


sleep()方法:
當程序運行到Thread.sleep(100L);時,休眠100毫秒,同時交出CPU時間片,100毫秒後,重新進入可運行狀態,等待CPU重新分配時間片,而線程交出時間片時,CPU拿到時間片,由操作系統負責在客運行狀態的線程中選中並分配時間片
wait()方法:程序在運行時,遇到wait()方法,這時線程進入當前對象的等待隊列並交出CPU,等待其他線程notifyALL()時,才能重新回到可運行狀態,等待OS分配CPU

釋放鎖

java wait()notify釋放鎖
調用obj.wait()會立即釋放鎖,以便其他線程可以執行obj.notify(),但是notify()不會立刻立刻釋放sycronized(obj)中的obj鎖,必須要等notify()所在線程執行完synchronized(obj)塊中的所有代碼纔會釋放這把鎖。

而 yield(),sleep()不會釋放鎖。

 

Thread.sleep(0)   的作用是讓出當前線程的CPU時間片,觸發操作系統立刻重新進行一次CPU競爭。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章