深入理解happens-before規(guī)則

本文搬運自<<極客時間>>哈~相當于做個筆記了糕档。。痊硕。

為什么會有happens-before 規(guī)則赊级?

因為jvm會對代碼進行編譯優(yōu)化,指令會出現重排序的情況岔绸,為了避免編譯優(yōu)化對并發(fā)編程安全性的影響理逊,需要happens-before規(guī)則定義一些禁止編譯優(yōu)化的場景,保證并發(fā)編程的正確性亭螟。

public class VolatileExample {
    int x = 0 ;
    volatile boolean v = false;
    public void writer(){
        x = 42;
        v = true;
    }

    public void reader(){
        if (v == true){
            // 這里x會是多少呢
        }
    }
}

拋出問題:假設有兩個線程A和B挡鞍,A執(zhí)行了writer方法,B執(zhí)行reader方法预烙,那么B線程中獨到的變量x的值會是多少呢墨微?

jdk1.5之前,線程B讀到的變量x的值可能是0扁掸,也可能是42翘县,jdk1.5之后,變量x的值就是42了谴分。原因是jdk1.5中锈麸,對volatile的語義進行了增強。來看一下happens-before規(guī)則在這段代碼中的體現牺蹄。

1. 規(guī)則一:程序的順序性規(guī)則

一個線程中忘伞,按照程序的順序,前面的操作happens-before后續(xù)的任何操作。

對于這一點氓奈,可能會有疑問翘魄。順序性是指,我們可以按照順序推演程序的執(zhí)行結果舀奶,但是編譯器未必一定會按照這個順序編譯暑竟,但是編譯器保證結果一定==順序推演的結果。

2. 規(guī)則二:volatile規(guī)則

對一個volatile變量的寫操作育勺,happens-before后續(xù)對這個變量的讀操作但荤。

3. 規(guī)則三:傳遞性規(guī)則

如果A happens-before B,B happens-before C涧至,那么A happens-before C腹躁。

jdk1.5的增強就體現在這里』瑁回到上面例子中潜慎,線程A中,根據規(guī)則一蓖康,對變量x的寫操作是happens-before對變量v的寫操作的铐炫,根據規(guī)則二,對變量v的寫操作是happens-before對變量v的讀操作的蒜焊,最后根據規(guī)則三倒信,也就是說,線程A對變量x的寫操作泳梆,一定happens-before線程B對v的讀操作鳖悠,那么線程B在注釋處讀到的變量x的值,一定是42.

4.規(guī)則四:管程中的鎖規(guī)則

對一個鎖的解鎖操作优妙,happens-before后續(xù)對這個鎖的加鎖操作乘综。

這一點不難理解。

5.規(guī)則五:線程start()規(guī)則

主線程A啟動線程B套硼,線程B中可以看到主線程啟動B之前的操作卡辰。也就是start() happens before 線程B中的操作。

6.規(guī)則六:線程join()規(guī)則

主線程A等待子線程B完成邪意,當子線程B執(zhí)行完畢后九妈,主線程A可以看到線程B的所有操作。也就是說雾鬼,子線程B中的任意操作萌朱,happens-before join()的返回。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末策菜,一起剝皮案震驚了整個濱河市晶疼,隨后出現的幾起案子酒贬,更是在濱河造成了極大的恐慌,老刑警劉巖冒晰,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件同衣,死亡現場離奇詭異,居然都是意外死亡壶运,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進店門浪秘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蒋情,“玉大人,你說我怎么就攤上這事耸携】醚ⅲ” “怎么了?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵夺衍,是天一觀的道長狈谊。 經常有香客問我,道長沟沙,這世上最難降的妖魔是什么河劝? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮矛紫,結果婚禮上赎瞎,老公的妹妹穿的比我還像新娘。我一直安慰自己颊咬,他們只是感情好务甥,可當我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著喳篇,像睡著了一般敞临。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上麸澜,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天挺尿,我揣著相機與錄音,去河邊找鬼痰憎。 笑死票髓,一個胖子當著我的面吹牛,可吹牛的內容都是我干的铣耘。 我是一名探鬼主播洽沟,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蜗细!你這毒婦竟也來了裆操?” 一聲冷哼從身側響起怒详,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎踪区,沒想到半個月后昆烁,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡缎岗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年静尼,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片传泊。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡鼠渺,死狀恐怖,靈堂內的尸體忽然破棺而出眷细,到底是詐尸還是另有隱情拦盹,我是刑警寧澤,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布溪椎,位于F島的核電站普舆,受9級特大地震影響,放射性物質發(fā)生泄漏校读。R本人自食惡果不足惜沼侣,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望地熄。 院中可真熱鬧华临,春花似錦、人聲如沸端考。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽却特。三九已至扶供,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間裂明,已是汗流浹背椿浓。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留闽晦,地道東北人扳碍。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像仙蛉,于是被迫代替她去往敵國和親笋敞。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,802評論 2 345

推薦閱讀更多精彩內容