Java多線程系列之可見性

何為可見性瞧毙?

線程A修改了共享變量Var1,線程B能看到這個修改嗎您访?這就是所謂的可見性。
在多線程的世界里,每個線程都有自己的工作內存峻凫,里面存儲著各種變量命锄。線程方法中的局部變量不會有同步的問題侦讨。但是贴谎,不同線程之間的共享變量就不一定了鲫构。最典型的共享變量就是某個類的靜態(tài)成員。對于這些共享變量玫坛,每個線程都會把共享變量拷貝一份副本结笨,因為JVM只允許線程修改自己工作內存中的變量值。換言之湿镀,不同線程變量之間的傳遞必須經過主內存炕吸。如下圖:


JMM示意圖

這樣一來,線程1如果修改了共享變量勉痴,線程2不一定能夠看到赫模。除非線程1在更新自己的副本之后,還能把線程副本中的新值寫入到主內存中蒸矛。同時瀑罗,線程2能重新從主內存中刷新這個共享變量。

另外雏掠,還有一個現(xiàn)象就是指令重排序斩祭。它是編譯器或處理器為了提高程序性能而做的優(yōu)化。有如下幾種:

  • 編譯器優(yōu)化的重排序(編譯器優(yōu)化)
  • 指令級并行重排序(處理器優(yōu)化)
  • 內存系統(tǒng)的重排序(處理器優(yōu)化)

這個重排序會導致代碼書寫的順序與實際執(zhí)行順序不同的現(xiàn)象乡话。
重排序不會給單線程帶來內存可見性的問題摧玫。但是,多線程中程序交錯執(zhí)行時蚊伞,重排序可能會造成內存可見性問題席赂。下圖是《Java并發(fā)編程實踐》中的一個例子吮铭,能說明可見性的問題时迫。


重排序的栗子

綜上,多線程情況下谓晌,某個線程中變量值的修改可能在其他線程中看不到掠拳,這樣的問題就是多線程下的可見性問題。
以下方法可以解決可見性問題纸肉。

1溺欧、synchronized加鎖

JMM關于synchronized的兩條規(guī)定:

  • 線程解鎖前喊熟,必須把共享變量的最新值刷新到主內存中。
  • 線程加鎖時姐刁,將清空工作內存中共享變量的值芥牌,從而使用共享變量時需要從內存中重新讀取最新的值(注意:加鎖與解鎖需要是同一把鎖)。
    如此一來聂使,線程解鎖前對共享變量的修改壁拉,其他線程可見。

2柏靶、volatile

  • 禁止重排序優(yōu)化來保證內存可見性弃理。
  • 及時刷新主內存的值。當對volatile變量執(zhí)行寫操作時屎蜓,會在寫操作后加入一條store屏障指令痘昌;當對volatile變量執(zhí)行讀操作時,會在讀操作前加入一條load屏障指令炬转。這樣一寫一讀辆苔,保證了內存可見性。

volatile關鍵字使用注意事項

  • 不能保證volatile變量復合操作的原子性返吻。
  • 在多線程中安全的使用volatile變量必須同時滿足三個條件:
    1)對變量的寫入操作不依賴其當前值姑子,如number++不可以〔饨或者能夠確保只有單一的線程修改變量的值街佑。
    2)該變量沒有包含在具有其他變量的不變式中,如果有多個volatile變量捍靠,則每個volatile變量必須獨立于其他的volatile變量沐旨。
    3)訪問變量時,沒有其他的原因需要加鎖榨婆。

synchronized和volatile之間的區(qū)別

  • 加鎖可以保證可見性和原子性磁携,但是volatile只能保證可見性。
  • volatile不需要加鎖良风,比synchronized更輕量級谊迄,不會阻塞線程,效率更高烟央。所以统诺,如果能用volatile解決問題,還是應盡量使用volatile疑俭。

其他

  • 即使沒有保證可見性的措施粮呢,很多時候共享變量也能夠在主內存和工作內存中得到及時的更新?
    一般只有在短時間內高并發(fā)的情況下才會出現(xiàn)變量得不到及時更新的情況,因為CPU在執(zhí)行時會很快的刷新緩存啄寡,所以一般情況下很難看到這種問題豪硅,而且也與硬件性能有很大的關系,所以挺物,結果都是不可預測的懒浮。
  • java中l(wèi)ong、double是64位的识藤,其讀寫會分成兩次32位的操作嵌溢,并不是原子操作,但很多商用虛擬機都進行了優(yōu)化蹋岩,所以赖草,多線程編程時需要注意這兩種類型值的處理。

參考文章

https://www.cnblogs.com/rocomp/p/4780532.html
Java并發(fā)編程實踐

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末剪个,一起剝皮案震驚了整個濱河市秧骑,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌扣囊,老刑警劉巖乎折,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異侵歇,居然都是意外死亡骂澄,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進店門惕虑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來坟冲,“玉大人,你說我怎么就攤上這事溃蔫〗√幔” “怎么了?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵伟叛,是天一觀的道長私痹。 經常有香客問我,道長统刮,這世上最難降的妖魔是什么紊遵? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮侥蒙,結果婚禮上暗膜,老公的妹妹穿的比我還像新娘。我一直安慰自己辉哥,他們只是感情好桦山,可當我...
    茶點故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著醋旦,像睡著了一般恒水。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上饲齐,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天钉凌,我揣著相機與錄音,去河邊找鬼捂人。 笑死御雕,一個胖子當著我的面吹牛,可吹牛的內容都是我干的滥搭。 我是一名探鬼主播酸纲,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼瑟匆!你這毒婦竟也來了闽坡?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤愁溜,失蹤者是張志新(化名)和其女友劉穎疾嗅,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體冕象,經...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡代承,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了渐扮。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片论悴。...
    茶點故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖墓律,靈堂內的尸體忽然破棺而出意荤,到底是詐尸還是另有隱情,我是刑警寧澤只锻,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布玖像,位于F島的核電站,受9級特大地震影響齐饮,放射性物質發(fā)生泄漏捐寥。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一祖驱、第九天 我趴在偏房一處隱蔽的房頂上張望握恳。 院中可真熱鬧,春花似錦捺僻、人聲如沸乡洼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽束昵。三九已至拔稳,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間锹雏,已是汗流浹背巴比。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留礁遵,地道東北人轻绞。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像佣耐,于是被迫代替她去往敵國和親政勃。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,728評論 2 351

推薦閱讀更多精彩內容

  • 從三月份找實習到現(xiàn)在兼砖,面了一些公司稼病,掛了不少,但最終還是拿到小米掖鱼、百度然走、阿里、京東戏挡、新浪芍瑞、CVTE、樂視家的研發(fā)崗...
    時芥藍閱讀 42,218評論 11 349
  • 本文基于周志明的《深入理解java虛擬機 JVM高級特性與最佳實踐》所寫褐墅。特此推薦拆檬。 衡量一個服務性能的高低好壞,...
    陽光的技術小棧閱讀 1,069評論 0 3
  • 星期天早上妥凳,起了個大早竟贯,于是決定來個運動伸展伸展老腰。沒想到還沒開始 小家伙就醒了逝钥,看見我坐在墊子上屑那,馬上提著奶瓶...
    梁多多呀閱讀 1,162評論 2 1
  • 理想是對美好事物的希望和想象,現(xiàn)實是客觀存在的事物艘款。人們總愛把理想和現(xiàn)實拿來比較持际,覺得理想是美好的、豐滿的哗咆,而現(xiàn)實...
    喬納坦閱讀 389評論 0 1
  • 我是學院籃球隊的蜘欲,再過幾天就要比賽了,下午上完課晌柬,就跑去訓練了姥份,出了一身汗郭脂,想回寢室洗個澡,卻發(fā)現(xiàn)門鎖著澈歉,在狗...
    箬莙閱讀 192評論 0 0