JVM是怎麼實現執行緒鎖的?使用者13674086452579722019-09-01 20:36:18

1。 程式透過Thread t = new Thread(),呼叫t。start()啟動一個執行緒,使該執行緒進入可執行(Runnable)的狀態。

2。 由JVM的決定去排程(Scheduler) 在可執行狀態(Runnable)下的執行緒,使該執行緒處於執行 (Running) 狀態,由於JVM的排程會出現不可控性,即不是優先順序高的先被呼叫,可能先呼叫,也可能後呼叫的的情況。執行狀態(Running)下,呼叫禮讓yield()方法,可以使執行緒回到可執行狀態(Runnable)下,再次JVM的排程(並不依賴優先順序)。

3。 執行緒在Running的過程中可能會遇到阻塞(Blocked)情況

①.呼叫join()和sleep()方法,sleep()時間結束或被打斷,join()中斷,IO完成都會回到Runnable狀態,等待JVM的排程。

②.呼叫wait(),使該執行緒處於等待池(wait blocked pool),直到notify()/notifyAll(),執行緒被喚醒被放到鎖池(lock blocked pool ),釋放同步鎖使執行緒回到可執行狀態(Runnable)

③.對Running狀態的執行緒加同步鎖(Synchronized)使其進入(lock blocked pool ),同步鎖被釋放進入可執行狀態(Runnable)。

4。 執行緒run()執行結束或異常退出,執行緒到達死亡狀態(Dead)

sleep和wait的區別有:

1,類:這兩個方法來自不同的類分別是Thread和Object

2,鎖:最主要是sleep方法沒有釋放鎖,而wait方法釋放了鎖,使得其他執行緒可以使用同步控制塊或者方法。

3,域:wait,notify和notifyAll只能在同步控制方法或者同步控制塊裡面使用,而sleep可以在

任何地方使用

synchronized(x){

x。notify()

//或者wait()

}

4,異:sleep必須捕獲異常,而wait,notify和notifyAll不需要捕獲異常

5,停:其實兩者都可以讓執行緒暫停一段時間,但是本質的區別是一個執行緒的執行狀態控制,一個是執行緒之間的通訊的問題

notify():喚醒一個處於等待狀態的執行緒,注意的是在呼叫此方法的時候,並不能確切的喚醒某一個等待狀態的執行緒,而是由JVM確定喚醒哪個執行緒,而且不是按優先順序。

notifyAll():喚醒所有處入等待狀態的執行緒,注意並不是給所有喚醒執行緒一個物件的鎖,而是讓它們競爭。