源**中的指令順序和實際執行時的指令順序可能是不同的,編譯器出於優化的目的,會對指令進行「重排序」,會採用亂序或並行等方式來執行指令,它只要滿足乙個條件即可:「程式的最終結果與在嚴格序列環境中執行的結果相同」。在這種情形下,如果另乙個執行緒坐在那觀察某個執行過程中的執行緒,會發現該執行緒的執行過程是不可**的,在這個時候得到的狀態也是無效的,這就是安全發布的必要性。
除此之外,jmm 中每個執行緒有自己的本地的快取(也就是下圖中的工作記憶體),如果某個執行緒更新變數之後沒有及時同步到主記憶體,其他執行緒是看不到更新後的值的,這就帶來可見性的問題,但這在快取一致性的要求上是滿足最小保證的:允許不同的處理器再任意時刻從同乙個儲存位置上看到不同的值。
管程鎖定規則(monitor lock rule):同乙個鎖的 unlock 操作先行發生於後面(時間上先後)的 lock 操作
volatile 變數規則(volatile variable rule):對乙個 volatile 變數的寫操作先行發生於後面(時間上先後)對這個變數的讀操作。
java記憶體模型
一 原子性 原子性是指乙個操作是不可中斷的,即使是多個執行緒一起執行的時候,乙個操作的開始,就不會被其他執行緒干擾 那麼有人會想到 i 是原子操作嗎?答案肯定不是。因為i 至少包含兩個操作,讀 從記憶體中讀出來 和行為 加上去 還有可能把加完後的資料在方法到i裡面去,出來也是1,這兩個執行緒同時進行...
Java記憶體模型
1.首先,執行緒a把本地記憶體a中更新過的共享變數重新整理到主記憶體中去。2.然後,執行緒b到主記憶體中去讀取執行緒a之前已更新過的共享變數。1.共享物件對各個執行緒的可見性 2.共享物件的競爭現象 指令級並行的重排序 如果不存l在資料依賴性,處理器可以改變語句對應機器指令的執行順序。記憶體系統的重...
Java記憶體模型
int x 0 thread a int y x thread bint x 5 int y 8 int z x y 關於上面的 存在這樣關係 x和z之間存在資料依賴關係,同時y和z之間也存在資料依賴關係。為了得到正確的結果,執行指令序列時,z不能重排序到x和y的前面。但是x和y之間並沒有資料依賴關...