具體的Thread提供的方法就不介紹了,這里會介紹線程狀態(tài),并發(fā)涉及到的相關(guān)組件以及等待通知模型
線程的狀態(tài)

線程的狀態(tài)
需要注意等待狀態(tài)與阻塞狀態(tài)的區(qū)別,分別是進(jìn)入等待隊列和同步隊列(后面會詳細(xì)講述這里的實現(xiàn)部分,個人理解鎖的核心就是這倆隊列)
synchronized關(guān)鍵字:保證了線程訪問的可見性和排他性

對象,監(jiān)視器,同步隊列,執(zhí)行線程的關(guān)系
正確的理解關(guān)系才能更好的理解實現(xiàn)。理清楚對象,監(jiān)視器,同步隊列,執(zhí)行線程的關(guān)系才能更好的深入實現(xiàn)部分理解
線程獲取監(jiān)視器對象成功則正常訪問,失敗則進(jìn)入同步隊列
等待/通知機制
它是基于同步機制提供了等待隊列的模式,其目的是為了確保等待線程從wait()方法返回時能夠感知到通知線程對變量做出的修改
有以下細(xì)節(jié)需要注意
- 使用wait()、notify()和notifyAll()時需要先對調(diào)用對象加鎖。
- 調(diào)用wait()方法后,線程狀態(tài)由RUNNING變?yōu)閃AITING,并將當(dāng)前線程放置到對象的 等待隊列。
- notify()或notifyAll()方法調(diào)用后,等待線程依舊不會從wait()返回,需要調(diào)用notify()或 notifAll()的線程釋放鎖之后,等待線程才有機會從wait()返回。
- notify()方法將等待隊列中的一個等待線程從等待隊列中移到同步隊列中,而notifyAll() 方法則是將等待隊列中所有的線程全部移到同步隊列,被移動的線程狀態(tài)由WAITING變?yōu)?BLOCKED。
-
從wait()方法返回的前提是獲得了調(diào)用對象的鎖。
WaitNotify運行過程
等待通知的經(jīng)典范式
等待方遵循如下原則。
- 獲取對象的鎖。
- 如果條件不滿足,那么調(diào)用對象的wait()方法,被通知后仍要檢查條件。
- 條件滿足則執(zhí)行對應(yīng)的邏輯。
對應(yīng)的偽代碼如下。
synchronized(對象) {
while(條件不滿足) {
對象.wait();
}
// 對應(yīng)的處理邏輯
}
通知方遵循如下原則。
- 獲得對象的鎖。
- 改變條件。
- 通知所有等待在對象上的線程。
對應(yīng)的偽代碼如下。
synchronized(對象) {
// 改變條件
對象.notifyAll();
}
這個經(jīng)典范式適用情況太多了
稍微改編一下就可以變?yōu)榈却瑫r模型
synchronized(對象) {
long future = System.currentTimeMillis()+mills;
long wait = mills;
while(條件不滿足 && wait>0) {
對象.wait();
wait = future - System.currentTimeMillis()();
}
// 對應(yīng)的處理邏輯
}
依托于等待通知模型可以典型的構(gòu)建模型有
阻塞隊列(ArrayBlockedQueue(以ArrayList做中心),LinkedBlockedQueue(以LinkedList做中心))(這里還是很有價值的,下面會詳細(xì)的介紹)
數(shù)據(jù)庫連接池(以池對象作為中心)
線程池技術(shù)(以job隊列作為中心,實際中是直接使用阻塞隊列實現(xiàn)的)
其他
這里需要注意這個等待通知模型,它真的太屌了,后面介紹的鎖的實現(xiàn)部分會深入的介紹等待隊列,同步隊列。如果沒有很好的理解等待通知模型,那看實現(xiàn)部分感覺有點不切實際。還有WaitNotify運行過程那個圖也是很好能理解等待隊列,同步隊列
