以下內容**
在同一程式中執行多個執行緒本身不會導致問題,問題在於多個執行緒訪問了相同的資源。如,同一記憶體區(變數,陣列,或物件)、系統(資料庫,web services等)或檔案。實際上,這些問題只有在一或多個執行緒向這些資源做了寫操作時才有可能發生,只要資源沒有發生變化,多個執行緒讀取相同的資源就是安全的。
多執行緒同時執行下面的**可能會出錯:
publicclass
counter
}
想象下執行緒a和b同時執行同乙個counter物件的add()方法,我們無法知道作業系統何時會在兩個執行緒之間切換。jvm並不是將這段**視為單條指令來執行的,而是按照下面的順序:
從記憶體獲取 this.count 的值放到暫存器
將暫存器中的值增加value
將暫存器中的值寫回記憶體
觀察執行緒a和b交錯執行會發生什麼:
this.count = 0;a:讀取
this.count 到乙個暫存器 (0)
b:讀取
this.count 到乙個暫存器 (0)
b:將暫存器的值加2
b:回寫暫存器值(2)到記憶體. this.count 現在等於 2a:將暫存器的值加3
a:回寫暫存器值(3)到記憶體. this.count 現在等於 3
兩個執行緒分別加了2和3到count變數上,兩個執行緒執行結束後count變數的值應該等於5。然而由於兩個執行緒是交叉執行的,兩個執行緒從記憶體中讀出的初始值都是0。然後各自加了2和3,並分別寫回記憶體。最終的值並不是期望的5,而是最後寫回記憶體的那個執行緒的值,上面例子中最後寫回記憶體的是執行緒a,但實際中也可能是執行緒b。如果沒有採用合適的同步機制,執行緒間的交叉執**況就無法預料。
競態條件&臨界區
8 Java併發性和多執行緒 靜態條件與臨界區
以下內容 在同一程式中執行多個執行緒本身不會導致問題,問題在於多個執行緒訪問了相同的資源。如,同一記憶體區 變數,陣列,或物件 系統 資料庫,web services等 或檔案。實際上,這些問題只有在一或多個執行緒向這些資源做了寫操作時才有可能發生,只要資源沒有發生變化,多個執行緒讀取相同的資源就是...
(十五)Java併發性和多執行緒 死鎖
死鎖是兩個或更多執行緒阻塞著等待其它處於死鎖狀態的執行緒所持有的鎖。死鎖通常發生在多個執行緒同時但以不同的順序請求同一組鎖的時候。例如,如果執行緒1鎖住了a,然後嘗試對b進行加鎖,同時執行緒2已經鎖住了b,接著嘗試對a進行加鎖,這時死鎖就發生了。執行緒1永遠得不到b,執行緒2也永遠得不到a,並且它們...
16 Java併發性和多執行緒 死鎖
以下內容 死鎖是兩個或更多執行緒阻塞著等待其它處於死鎖狀態的執行緒所持有的鎖。死鎖通常發生在多個執行緒同時但以不同的順序請求同一組鎖的時候。例如,如果執行緒1鎖住了a,然後嘗試對b進行加鎖,同時執行緒2已經鎖住了b,接著嘗試對a進行加鎖,這時死鎖就發生了。執行緒1永遠得不到b,執行緒2也永遠得不到a...