Java併發相關概念

541732025發表於2014-03-28


這是Java記憶體結構模型,其實還有更復雜的CPU快取記憶體,這裡略過,只講working memory與main memory。
working memory,執行緒工作記憶體,執行緒私有,對應的操作:lock、load、use、assign、store、unlock
load:將main memory的值複製到working memory
use:
在workingmemory中改變值
assign:對值進行其他操作,如從運算元棧彈出,賦給區域性變數區
store:將變數值從working memory複製到main memory
main memory,主記憶體,執行緒共享,對應的操作:lock、read、write、unlock

關於volatile
volatile僅能保證修飾物件的可見性,不能保證在此物件上的操作的原子性。(jdk1.5之後還能夠保證修飾的物件禁止指令重排)
volatile修飾的變數,執行緒不會將其從main memory複製到work memory,而是直接在main memory中操作。它的代價比synchronized、lock/unlock低,但用起來要非常小心,畢竟不能保證原子操作。
使用volatile的場景:對當前變數的改變不依賴於變數之前的值,如boolean標誌位。

執行緒互動:
wait、notify、notifyAll
當執行緒呼叫了物件的wait方法後,JVM執行緒執行引擎會將次執行緒放入一個wait sets中,並釋放該執行緒在物件上的鎖。wait set中的執行緒不會被JVM執行緒執行引擎排程執行。
當其他執行緒呼叫了此物件的notify方法時,會從wait sets中隨機找一個等待在此物件上的執行緒,並將其從wait sets中移除,這樣JVM執行緒執行引擎就可以再次排程執行該執行緒了。
當呼叫的是notifyAll方法時,會刪除wait sets上所有等待在此物件上的執行緒,然後釋放鎖,讓它們競爭鎖。

執行緒生命週期:
執行緒分為幾種不同的狀態,根據狀態放入不同的sets來進行排程 
剛建立時,為new狀態
呼叫start方法後,進入runnable狀態,放入JVM的可執行執行緒佇列中,等待CPU執行許可權
JVM按照執行緒優先順序、時間片、輪循方式來執行runnable狀態的執行緒
執行緒進入start程式碼段,開始執行,狀態變為running
執行過程中出現了sleep、wait、join或者出現IO阻塞、鎖等待時,則進入wait或blocked狀態,這是執行緒放棄CPU時間片進入wait sets或鎖sets
知道wait結束,執行緒被喚醒或獲取到鎖,執行緒在此進入runnable狀態
執行緒執行完畢,執行緒就從可執行執行緒佇列中刪除了。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28912557/viewspace-1131660/,如需轉載,請註明出處,否則將追究法律責任。

相關文章