java執行緒的狀態+鎖分析
在最開始貼出我的執行緒狀態理解簡圖(沒畫出結束狀態):
下面就來分析一下執行緒的整個可能出現的狀態和狀態變化出現的原因。我們都知道新建一個執行緒是很簡單的,可以通過繼承Thread或者實現Runnable/Callable介面來建立一個新的執行緒。在呼叫了start()方法之後該執行緒就進入了就緒狀態,而且在就緒狀態只能等待系統排程。在執行中的執行緒在碰到①t.join(),t.sleep(),或者是等待使用者輸入的過程就會進入阻塞狀態,只有在②join前面的執行緒執行完或者sleep時間到了和系統給與了輸入之後才能接除阻塞重新回到就緒狀態,又或者是碰到了有synchonized關鍵字鎖住的部分而且沒有獲取到鎖的時候就會進入鎖池狀態知道獲取到鎖才回到就緒狀態,當然這裡也可以理解為進入了一個同步佇列(這個稍後會再細講)。又或者是碰到了Object的wait方法或者LockSupport.park()進入一個等待佇列,當持有該物件的其他執行緒執行notify/notifyAll方法或者LockSupport.unpark()後會使其進入同步佇列,當然這裡還有一些超時的等待狀態,跟不超時的類似,這裡就不細說了。
在前面的描述中一致有提到鎖的概念,鎖其實是JVM層提供的,每個物件都有一個monitor,當持有這個物件的monitor時我們說我們持有了這個物件的鎖。synchonized關鍵字保證了同一個時刻只能有一個執行緒持有這把鎖,它的具體實現是有monitorenter和monitorexit指令完成的,而且這兩個指令一定是成對出現的。線上程的等待通知模型裡面的執行過程如下圖(t1為等待執行緒t2為喚醒執行緒):
這也是為什麼我們說wait方法會釋放鎖的原因了。
補充: Object的wait/notify和LockSupport的park/unpark區別: Object的方法之間有嚴格的順序控制,如果執行順序出現變化就會得到不同的結果,但是park/unpark是針對執行緒作用,無論執行順序是否變化,最終都會執行所有執行緒程式碼。
相關文章
- Java執行緒狀態及同步鎖Java執行緒
- 執行緒狀態和鎖執行緒
- Java執行緒的狀態Java執行緒
- Java多執行緒-執行緒狀態Java執行緒
- 【Java】執行緒的 6 種狀態Java執行緒
- Java 執行緒的5種狀態Java執行緒
- 詳解Java執行緒池的ctl(執行緒池控制狀態)【原始碼分析】Java執行緒原始碼
- Java執行緒狀態轉換Java執行緒
- 如何使用jstack分析執行緒狀態JS執行緒
- 執行緒狀態執行緒
- Java執行緒狀態及切換Java執行緒
- java執行緒的五大狀態,阻塞狀態詳解Java執行緒
- JavaSE_多執行緒入門 執行緒安全 死鎖 狀態 通訊 執行緒池Java執行緒
- 一起分析執行緒的狀態及執行緒通訊機制執行緒
- JAVA 執行緒狀態及轉化(轉)Java執行緒
- Java多執行緒(2)執行緒鎖Java執行緒
- 玩轉java多執行緒 之多執行緒基礎 執行緒狀態 及執行緒停止實戰Java執行緒
- ThreadPollExcutor執行緒池的狀態thread執行緒
- 【JAVA併發第二篇】Java執行緒的建立與執行,執行緒狀態與常用方法Java執行緒
- 多執行緒的執行緒狀態及相關操作執行緒
- Java的六種執行緒狀態及程式碼示例Java執行緒
- 乾貨:教你如何監控 Java 執行緒池執行狀態Java執行緒
- 深入理解Java多執行緒與併發框(第①篇)——執行緒的狀態Java執行緒
- Systrace 執行緒 CPU 執行狀態分析技巧 - Sleep 和 Uninterruptible Sleep 篇執行緒
- Java執行緒生命週期與狀態切換Java執行緒
- 淺談 Java執行緒狀態轉換及控制Java執行緒
- Java 執行緒安全 與 鎖Java執行緒
- MySQL執行緒狀態詳解MySql執行緒
- jstack判斷執行緒狀態JS執行緒
- 執行緒的幾種狀態總結執行緒
- Java併發程式設計序列之執行緒狀態Java程式設計執行緒
- Java多執行緒中執行緒安全與鎖問題Java執行緒
- JAVA多執行緒詳解(3)執行緒同步和鎖Java執行緒
- java中WAITING狀態的執行緒為啥還會消耗CPUJavaAI執行緒
- Java多執行緒(五):死鎖Java執行緒
- java多執行緒(5)死鎖Java執行緒
- Memcached 多執行緒和狀態機執行緒
- 執行緒的6種狀態以及轉變執行緒