Java內(nèi)存模型

參考:海子的博客Java并發(fā)編程:volatile關(guān)鍵字解析

三個(gè)重點(diǎn):

  1. 原子性
  2. 可見性
  3. 有序性

討論這三點(diǎn)之前先說一下計(jì)算機(jī)的內(nèi)存模型:

  • CPU對(duì)程序的指令的執(zhí)行速度遠(yuǎn)遠(yuǎn)大于從內(nèi)存中讀寫數(shù)據(jù)的速度
    所以如果讓CPU直接訪問內(nèi)存來讀數(shù)據(jù)再寫結(jié)果去內(nèi)存,就會(huì)效率非常低下绩社。因此就有了高速緩存——Cache這個(gè)東西炸宵。


    CPU和內(nèi)存之間存在高速緩存产上,他們之間的工作關(guān)系
  • 舉個(gè)例子看看他們?cè)趺垂ぷ鞯?
    i=0;
    單線程運(yùn)行代碼:i=i+1;
    步驟是:Cache從主存讀取i=0隘马, CPU從Cache讀取i,CPU運(yùn)算i=i+1队腐, 將結(jié)果i=1寫入Cache坐儿,Cache再將結(jié)果i=1寫入主存。
    單線程沒問題贝乎,但是多線程中情连,比如開啟兩個(gè)線程分別執(zhí)行i=i+1;,我們希望結(jié)果是i=2
    但是結(jié)果可能會(huì)是這樣:
    線程1的cache從內(nèi)存讀i=0,這時(shí)览效,沒有馬上計(jì)算却舀,CPU馬上換到線程2讀取,這是i仍然是0锤灿,然后線程1和線程2的cache再分別把i=0給cpu進(jìn)行計(jì)算都得到i=1挽拔,然后分別刷新到主存中,最后的結(jié)果是i=1

因此
出現(xiàn)了緩存一致性協(xié)議但校,意思是:當(dāng)CPU寫數(shù)據(jù)時(shí)螃诅,如果發(fā)現(xiàn)操作的變量是共享變量,即在其他CPU中也存在該變量的副本状囱,會(huì)發(fā)出信號(hào)通知其他CPU將該變量的緩存行置為無效狀態(tài)术裸,因此當(dāng)其他CPU需要讀取這個(gè)變量時(shí),發(fā)現(xiàn)自己緩存中緩存該變量的緩存行是無效的亭枷,那么它就會(huì)從內(nèi)存重新讀取袭艺。

現(xiàn)在進(jìn)入正題:

java內(nèi)存模型:
Java內(nèi)存模型規(guī)定所有的變量都是存在主存當(dāng)中,每個(gè)線程都有自己的工作內(nèi)存(類似于前面的高速緩存)叨粘。線程對(duì)變量的所有操作都必須在工作內(nèi)存中進(jìn)行猾编,而不能直接對(duì)主存進(jìn)行操作。并且每個(gè)線程不能訪問其他線程的工作內(nèi)存升敲。
圖示:


  1. 原子性:
  • 在Java中袍镀,對(duì)基本數(shù)據(jù)類型變量的讀取和賦值操作是原子性操作,即這些操作是不可被中斷的冻晤,要么執(zhí)行苇羡,要么不執(zhí)行。
  • 只有簡單的讀取鼻弧、賦值(而且必須是將數(shù)字賦值給某個(gè)變量设江,變量之間的相互賦值不是原子操作)才是原子操作锦茁。
x = 10;         //語句1
y = x;         //語句2
x++;           //語句3
x = x + 1;     //語句4

哪幾個(gè)是原子操作?只有語句一是原子性操作叉存;其他操作除了讀取之外都有賦值码俩,因此不是原子性。
如果要實(shí)現(xiàn)大范圍的原子性操作歼捏,就要用同步稿存。

  1. 可見性:
    在CPU讀寫數(shù)據(jù)的時(shí)候,不同線程之間對(duì)變量的更行可能沒有及時(shí)刷新到內(nèi)存中去瞳秽,因此其他線程不能立刻看到修改后的變量瓣履,這是不可見的。java中提供了兩種實(shí)現(xiàn)可見性的方法:
    1练俐、volatile關(guān)鍵字:當(dāng)一個(gè)變量被volatile修飾時(shí)袖迎,它會(huì)保證修改的值會(huì)立即被更新到主存,當(dāng)有其他線程需要讀取時(shí)腺晾,它會(huì)去內(nèi)存中讀取新值燕锥。而普通的共享變量不能保證可見性,因?yàn)槠胀ü蚕碜兞勘恍薷闹竺醪酰裁磿r(shí)候被寫入主存是不確定的归形,當(dāng)其他線程去讀取時(shí),此時(shí)內(nèi)存中可能還是原來的舊值鼻由,因此無法保證可見性连霉。
    2、同步:synchronized和Lock能保證同一時(shí)刻只有一個(gè)線程獲取鎖然后執(zhí)行同步代碼嗡靡,并且在釋放鎖之前會(huì)將對(duì)變量的修改刷新到主存當(dāng)中。因此可以保證可見性窟感。
  2. 有序性:
    為了提高程序的運(yùn)行效率讨彼,沒有數(shù)據(jù)依賴性的代碼段可能會(huì)被處理器重新排序,也叫指令重排序柿祈。(但是有數(shù)據(jù)依賴性的代碼就不會(huì)重排序)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末哈误,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子躏嚎,更是在濱河造成了極大的恐慌蜜自,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,695評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件卢佣,死亡現(xiàn)場(chǎng)離奇詭異重荠,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)虚茶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門戈鲁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來仇参,“玉大人,你說我怎么就攤上這事婆殿≌┢梗” “怎么了?”我有些...
    開封第一講書人閱讀 168,130評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵婆芦,是天一觀的道長怕磨。 經(jīng)常有香客問我,道長消约,這世上最難降的妖魔是什么肠鲫? 我笑而不...
    開封第一講書人閱讀 59,648評(píng)論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮荆陆,結(jié)果婚禮上滩届,老公的妹妹穿的比我還像新娘。我一直安慰自己被啼,他們只是感情好帜消,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著浓体,像睡著了一般泡挺。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上命浴,一...
    開封第一講書人閱讀 52,268評(píng)論 1 309
  • 那天娄猫,我揣著相機(jī)與錄音,去河邊找鬼生闲。 笑死媳溺,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的碍讯。 我是一名探鬼主播悬蔽,決...
    沈念sama閱讀 40,835評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼捉兴!你這毒婦竟也來了蝎困?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,740評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤倍啥,失蹤者是張志新(化名)和其女友劉穎禾乘,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體虽缕,經(jīng)...
    沈念sama閱讀 46,286評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡始藕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鳄虱。...
    茶點(diǎn)故事閱讀 40,505評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡弟塞,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出拙已,到底是詐尸還是另有隱情决记,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布倍踪,位于F島的核電站系宫,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏建车。R本人自食惡果不足惜扩借,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望缤至。 院中可真熱鬧潮罪,春花似錦、人聲如沸领斥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽月洛。三九已至何恶,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間嚼黔,已是汗流浹背细层。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留唬涧,地道東北人疫赎。 一個(gè)月前我還...
    沈念sama閱讀 48,921評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像碎节,于是被迫代替她去往敵國和親捧搞。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評(píng)論 2 359

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