色婷婷狠狠18禁久久YY,CHINESE性内射高清国产,国产女人18毛片水真多1,国产AV在线观看

JVM是怎么實現線程鎖的

張吉惟2年前20瀏覽0評論

JVM是怎么實現線程鎖的?

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():喚醒所有處入等待狀態的線程,注意并不是給所有喚醒線程一個對象的鎖,而是讓它們競爭。

java 線程暫停,JVM是怎么實現線程鎖的