Java併發中volatile和happen before是什麼? - javarevisited
要了解happen before,需要首先了解如果多個執行緒訪問同一個變數會發生什麼問題?尤其是當一個執行緒寫入該變數,而一個執行緒同時從該變數讀取時。
例如,假設我們有以下由執行緒T1執行的程式碼(請注意,整數變數y在x之前初始化):
int y = 1; int x = 2; |
現在,我們還有另一段程式碼T2,它由另一個執行緒T2執行,在該執行緒中,兩個變數的值都被列印出來(注意變數x在y之前列印):
System.out.print(x); System.out.println(y); |
螢幕上應該列印什麼?如果此程式碼是由同一執行緒執行的,則可以保證將2和1列印出來,但是對於多個執行緒,則沒有保證的行為。T2很有可能看不到T1所做的分配,而只為x和y輸出0。 也可能只看到x或y的初始化並進行相應列印。 這是可怕的且不可預測的,想想如果X是您銀行帳戶中的錢,您肯定想要可預測的行為。那就是happen before需要做的事情
happen before提供了某種順序和可見性保證:
[b]-“一個[/b] |
[b]寫入將在另一個對該[/b] |
[b]讀取之前發生。”[/b] |
-“同步塊上的解鎖將在另一個對其上鎖之前發生。”
執行緒T1寫入volatile變數的值也就是所有更改將線上程T2讀取相同volatile變數時可見,執行緒T1解鎖之前,對T2在同一鎖監視器內的鎖進行上鎖之前也是可見的。(這樣通過前後關係保證了T1和T2兩個執行緒操作同一個資源的先後順序)
落實到前面程式碼,修改如下:
T1: int y = 1; <p>[b]volatile [/b]int x = 2; T2: System.out.print(x); System.out.println(y); |
增加了volatile 變數修飾之後,建立了兩個執行緒的happen before先後順序。
這時,T2肯定是輸出了x=2的結果,因為它見到了T1的所有更改結果,這是volatile 作用,那麼結果是
2和1或2和0?
如果您在T1進行volatile變數寫入而T2進行volatile變數讀取之前應用了happens-before這樣關係,那麼它還將看到y = 1的值,雖然沒有使用volatile修飾符。
最後結果是確定的2和1。
這裡要記住的關鍵是,執行緒T2甚至可以看到非易失性volatile變數的值。這裡只是發生happens-before關係的一個示例,但在分析多執行緒程式的行為時非常有用。
相關文章
- 併發程式設計之 Java 記憶體模型 + volatile 關鍵字 + Happen-Before 規則程式設計Java記憶體模型APP
- Java併發程式設計——為什麼要用volatile關鍵字Java程式設計
- Java併發系列之volatileJava
- Java併發(3)- 聊聊VolatileJava
- Java併發(2)- 聊聊happens-beforeJavaAPP
- Java併發—— 關鍵字volatile解析Java
- Java併發2:JMM,volatile,synchronized,finalJavasynchronized
- java併發之volatile關鍵字Java
- 大白話聊聊Java併發面試問題之volatile到底是什麼?【石杉的架構筆記】Java面試架構筆記
- Java中equals和==比的是什麼Java
- 什麼是高併發,怎麼解決高併發
- java 中/**是什麼Java
- java併發程式設計:volatile關鍵字Java程式設計
- Java併發程式設計volatile關鍵字Java程式設計
- java併發程式設計——volatile關鍵字Java程式設計
- 譯文《Java併發程式設計之volatile》Java程式設計
- 併發數、併發以及高併發分別是什麼意思?
- 併發-4-volatile
- Java記憶體模型FAQ(十)volatile是幹什麼用的Java記憶體模型
- Java併發程式設計:volatile關鍵字解析Java程式設計
- 【死磕Java併發】-----記憶體模型之happens-beforeJava記憶體模型APP
- java中RMI是什麼Java
- java中@Inherited是什麼?Java
- java中@Retention是什麼?Java
- 併發的核心:CAS 是什麼?Java8是如何優化 CAS 的?Java優化
- 如何給女朋友解釋什麼是併發和並行並行
- Java之併發程式設計:volatile關鍵字解析Java程式設計
- java中死鎖是什麼Java
- java中lock介面是什麼Java
- 【多執行緒與高併發】Java守護執行緒是什麼?什麼是Java的守護執行緒?執行緒Java
- Java併發指南3:併發三大問題與volatile關鍵字,CAS操作Java
- Java和Python是什麼?有什麼區別?JavaPython
- 深入探究Java中equals()和==的區別是什麼Java
- 【Java面試】Mybatis中#{}和${}的區別是什麼?Java面試MyBatis
- Java是什麼_Java是做什麼的?Java
- 併發程式設計之volatile程式設計
- 再有人問你volatile是什麼,就把這篇文章發給他
- Java併發程式設計-volatile可見性的介紹Java程式設計