【Java并發(fā)編程與高并發(fā)解決方案】JAVA內(nèi)存模型JMM以及亂序執(zhí)行優(yōu)化(重排序)

出現(xiàn)線程安全問題顾犹,一般是因?yàn)橹鞔婧凸ぷ鲀?nèi)存數(shù)據(jù)不一致以及重排序,那今天就說一下這兩個(gè)方面。

亂序執(zhí)行優(yōu)化

亂序執(zhí)行優(yōu)化是多核CPU為了提高效率而做的不符合代碼規(guī)則的優(yōu)化度宦。

int a = 1;
int b = 1;
int c = a + b;
  • 正常我們看到的執(zhí)行順序是A-B-C式撼,但是因?yàn)镃PU的重排序童社,運(yùn)行順序有可能變?yōu)锽-A-C,這時(shí)候結(jié)果是不會受到任何影響的著隆。

JMM

  • 說到并發(fā)就要設(shè)計(jì)多個(gè)線程之間是如何通信的扰楼,通信可以分為兩種:消息傳遞以及內(nèi)存共享,而java主要使用到內(nèi)存共享美浦。說到內(nèi)存共享就要先來看一下java的內(nèi)存結(jié)構(gòu)了弦赖。


    image.png
  • Java的內(nèi)存結(jié)構(gòu)主要分為棧和堆。
    • 棧的速度僅次于寄存器浦辨,速度快蹬竖,但是大小和生存周期是固定的
    • 主要用來存放一些基本類型的局部變量。
    • 不同的線程棧之間是相互獨(dú)立的,存放的變量對于其他線程不可見币厕,即使他們運(yùn)行的是同一段代碼列另。
    • 是運(yùn)行的數(shù)據(jù)區(qū),是動(dòng)態(tài)分配的(比如new關(guān)鍵字)旦装,所以速度存取速度較慢
    • 存在垃圾回收页衙,所以大小和生命周期是不確定的。
    • 是共享的同辣,主要用來存放對象
enter image description here
  • 當(dāng)一個(gè)線程棧持有一個(gè)對象拷姿,他只是持有了這個(gè)對象的引用(內(nèi)存地址),真正的對象還是在堆上旱函。
  • 一個(gè)對象的成員變量响巢,無論是啥類型,都是跟著對象存在于堆上的棒妨。
  • 這時(shí)候就有個(gè)問題踪古,如果多個(gè)線程,同時(shí)訪問同一個(gè)對象的同一個(gè)方法券腔,每個(gè)方法內(nèi)又有局部變量伏穆。會發(fā)生啥呢。
    • 其實(shí)啥也不會發(fā)生纷纫,多個(gè)線程訪問同一個(gè)方法枕扫,他們其實(shí)只是持有方法內(nèi)局部變量的拷貝。

硬件結(jié)構(gòu)和JMM的關(guān)系

enter image description here
  • 如果要從內(nèi)存中讀取數(shù)據(jù)處理后寫回辱魁,都經(jīng)歷了什么(從硬件角度來看)
    • 首先cpu發(fā)出指令
    • cache會在合適的時(shí)機(jī)把數(shù)據(jù)從內(nèi)存讀過來
    • cpu寄存器去執(zhí)行計(jì)算操作啥的
    • 寄存器把數(shù)據(jù)寫回到cache
    • cache在合適的時(shí)機(jī)把數(shù)據(jù)(上一個(gè)博客中提到的緩存行)寫回主存\
  • 硬件結(jié)構(gòu)和JMM有啥關(guān)系呢
    • 咱們上面說的棧和堆是在主存里的~當(dāng)然烟瞧,也會在不同的時(shí)機(jī)存在于cpu的緩存和寄存器(寄存器的速度比緩存還要快)

硬件結(jié)構(gòu)和JMM更抽象的關(guān)系

image.png
  • 前面說啦,java中線程的通信是通過內(nèi)存的共享染簇,那如果要完成一次通信参滴,要經(jīng)過這兩步
    • 線程1從主存中把變量讀到了本地內(nèi)存,進(jìn)行一系列操作后锻弓,寫回到主存
    • 線程2把數(shù)據(jù)從主存中讀到本地內(nèi)存
  • 這里說的本地內(nèi)存是一個(gè)抽象的概念砾赔,他包括了上面說的,cache/寄存器啥的青灼。
  • 那線程安全為啥會產(chǎn)生呢暴心,就是因?yàn)檫@個(gè)操作(基本上線程安全問題都是性能優(yōu)化導(dǎo)致的)
    • 如果一個(gè)線程要使用一個(gè)共享變量,首先要讀到本地內(nèi)存杂拨,后續(xù)的讀寫操作都是作用于本地內(nèi)存上的副本的酷勺,執(zhí)行完一系列操作后某個(gè)時(shí)刻,這個(gè)共享變量才會被從本地內(nèi)存寫回到主存扳躬。
    • 注意,在寫回到主存前,對于數(shù)據(jù)所執(zhí)行的操作對于別的線程是不可見的贷币。
    • 如果此時(shí)另一個(gè)線程讀取了主存中的共享變量击胜,就產(chǎn)生了“臟讀“∫畚疲可以使用關(guān)鍵字”volatile“來解決偶摔,這個(gè)后續(xù)會詳細(xì)說。
  • 內(nèi)存可見性JMM是通過happens-before關(guān)系來提供的促脉。這個(gè)在參考資料有詳細(xì)說辰斋,后面用到的時(shí)候也會寫出來。

接下來干啥

  • 明天說一下同步操作和同步規(guī)則后瘸味,理論的知識就暫時(shí)到這里宫仗。接下來會說一下并發(fā)模擬用到的工具以及代碼。

更詳細(xì)的參考資料:

http://ifeve.com/java-memory-model-6/
https://juejin.im/post/5ae6d309518825673123fd0e

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末旁仿,一起剝皮案震驚了整個(gè)濱河市藕夫,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌枯冈,老刑警劉巖毅贮,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異尘奏,居然都是意外死亡滩褥,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進(jìn)店門炫加,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瑰煎,“玉大人,你說我怎么就攤上這事琢感《洌” “怎么了?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵驹针,是天一觀的道長烘挫。 經(jīng)常有香客問我,道長柬甥,這世上最難降的妖魔是什么饮六? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮苛蒲,結(jié)果婚禮上卤橄,老公的妹妹穿的比我還像新娘。我一直安慰自己臂外,他們只是感情好窟扑,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布喇颁。 她就那樣靜靜地躺著,像睡著了一般嚎货。 火紅的嫁衣襯著肌膚如雪橘霎。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天殖属,我揣著相機(jī)與錄音姐叁,去河邊找鬼。 笑死洗显,一個(gè)胖子當(dāng)著我的面吹牛外潜,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播挠唆,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼处窥,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了损搬?” 一聲冷哼從身側(cè)響起碧库,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎巧勤,沒想到半個(gè)月后嵌灰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡颅悉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年沽瞭,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片剩瓶。...
    茶點(diǎn)故事閱讀 40,117評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡驹溃,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出延曙,到底是詐尸還是另有隱情豌鹤,我是刑警寧澤,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布枝缔,位于F島的核電站布疙,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏愿卸。R本人自食惡果不足惜灵临,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望趴荸。 院中可真熱鬧儒溉,春花似錦、人聲如沸发钝。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至园骆,卻和暖如春舔痪,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背锌唾。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留夺英,地道東北人晌涕。 一個(gè)月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像痛悯,于是被迫代替她去往敵國和親余黎。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評論 2 355

推薦閱讀更多精彩內(nèi)容