執行緒狀態和鎖

單同志發表於2019-08-20

介紹

執行緒狀態必須和鎖一起說才完整。這裡,主要是給出一張執行緒狀態的圖,並對幾個重要的點進行提醒。看完,大家有一個初步的印象,可以自選感興趣的點繼續深入

Thread狀態圖(包含加鎖後與執行緒狀態相互間的聯絡)

執行緒狀態和鎖

閱讀

閱讀這張圖,主要充實阻塞狀態的內容

阻塞狀態

阻塞狀態是指執行緒因為某種原因放棄了cpu 使用權,也即讓出了cpu timeslice,暫時停止執行。直到執行緒進入可執行(runnable)狀態,才有機會再次獲得cpu timeslice 轉到執行(running)狀態。阻塞的情況分三種:

  1. 等待阻塞:執行(running)的執行緒執行o.wait()方法,JVM會把該執行緒放入等待佇列(waitting queue)中
  2. 同步阻塞:執行(running)的執行緒在獲取物件的同步鎖時,若該同步鎖被別的執行緒佔用,則JVM會把該執行緒放入鎖池(lock pool)中。
  3. 其他阻塞:執行(running)的執行緒執行Thread.sleep(long ms)或t.join()方法,或者發出了I/O請求時,JVM會把該執行緒置為阻塞狀態。當sleep()狀態超時、join()等待執行緒終止或者超時、或者I/O處理完畢時,執行緒重新轉入可執行(runnable)狀態。
  • 圖中sleep,join屬於其它阻塞。他們不會釋放鎖。sleep,一段時間後進入runnable狀態。join,子執行緒完成或者一段時間後進入runnable狀態
  • 圖中wait,jvm把執行緒發放入等待佇列,屬於等待阻塞。會釋放物件鎖。進入等待佇列,通過object的notify,notifyall喚醒進入鎖池佇列。

額外介紹下Thread.yeild方法,此方法不會導致阻塞,讓當前執行緒直接進入runnable狀態。

相關文章