JMM模型

??(1).計算機底層CPU模型

????????? 如果三個cup的線程都從主內存中取到X=1的值進行計算,此時就要保證數據的一致性穴张,目前CPU使用MESI(緩存一致性協(xié)議)來控制,如果CPU1想從主內存拿到X=1這個值想要計算岂膳,首先寄存器會在本身尋找如果沒有砰蠢,則去緩存L1,L2,L3中依次尋找,如果都沒有則去主內存中拿到CPU緩存中最終放入寄存器計算虱岂,拿到后將X標注為E獨占狀態(tài)玖院,標記為E的同時又開啟了總線嗅探機制會時刻監(jiān)聽內存中X值,如果此時CPU2去拿主內存中的X=1在經過總線時會被監(jiān)聽到第岖,此時CPU1會將緩存行中的X狀態(tài)改為S共享狀態(tài)难菌,CPU2讀到值后也會標注為S共享狀態(tài),如果CPU1把X=1進行計算后蔑滓,得到X=2此時CPU1會把X的緩存行鎖住并且狀態(tài)置M修改郊酒,在把X=2回寫到主內存中消息經過總線會被CPU2監(jiān)聽機制監(jiān)聽到此時CPU2會把之前讀到的X=1置為I失效(大寫字母哎),然后接著CPU1會把X=2回寫到主內存中回寫完以后又會把CPU1中的X=2置為E獨占狀態(tài)键袱,如果CPU2還訪問得到X就要把之前存在緩存中的X=1丟棄燎窘,然后去主存? 中重新得到X=2,讀完之后CPU1嗅探到了CPU2讀到主存中的數據此時CPU1與CPU2又會把自己的狀態(tài)變成共享S了蹄咖。

??(2)MESI緩存一致性協(xié)議

??(3)線程分為用戶級別和內核級別線程褐健,比如java虛擬機 PS 或者播放器這些進程他們開啟一些線程,這些線程被稱作虛假線程不能真實操作CPU澜汤,他們需要被內核級線程提供的接口接收轉換蚜迅,真正接觸CPU的是內核級線程舵匾,CPU有Ring0,Ring3這些特權級別谁不,如果想操作CPU的話只能是Ring0級別也就是說只有內核級線程才能接觸到他坐梯,用戶級線程是用的ring3級別


??(4)線程的生命狀態(tài)


??(5)線程執(zhí)行切換(時間片算法)底層模型

1、首先CPU在執(zhí)行不用線程任務的話會有一種時間片算法刹帕,也就是把一個任務分成一個一個的時間片來執(zhí)行烛缔。

2、在時間片的切換過程中轩拨,如果當前CPU正在執(zhí)行時間片A執(zhí)行完要切換到時間片B,就要把A的當前的所有狀態(tài)(指令院喜,程序指針亡蓉,中間數據)都回寫到主內存中的TSS(任務狀態(tài)斷)中,之后開始執(zhí)行時間片B執(zhí)行完之后如果下一個被執(zhí)行的是A的話會重新把A的狀態(tài)從TSS中讀出來接著繼續(xù)執(zhí)行喷舀,

??(6)JMM模型如何保證操作的 原子性和有序性和可見性

???? 1.數據可見性砍濒,比如兩個線程在訪問同一塊內存區(qū)域數據的時候如下圖代碼,當線程A開始執(zhí)行的時候會先把數據從主內存中Load進工作副本在副本中復制一份主內存中的數據硫麻,然后use推進CPU因為A線程這里做了一個死循環(huán)爸邢,當前線程就一直在執(zhí)行這個操作,一直不斷的use推進CPU由于他優(yōu)先級比較高所以會一直占用線程著A拿愧,此時線程B開始執(zhí)行同樣從主內存load后推入CPU把值改為ture后在assign進工作內存把值改為true后寫回主內存把主內存的值也改為true杠河,此時線程A還在進行循環(huán)不斷推進中,無法感知到值被改為true浇辜,如果在load方法中while循環(huán)里加上一把鎖這樣會使線程A可能會阻塞從而導致線程的執(zhí)行權被搶走券敌,因為是時間片算法在搶走時會把狀態(tài)回寫到主內存中等到再獲CPU的執(zhí)行權再讀進工作內存中,這個操作可能會導致工作內存會重新讀取主內存中值柳洋,此時值是被線程B改過了所以此時可以保證數據一致待诅。

???? 2.如果在initflag變量前加上關鍵字,volatile就會開啟緩存一致性協(xié)議來保持線程間不同工作副本的數據可見性


???? 3.有序性:操作要保持有序性是因為JVM在執(zhí)行一些操作時候如果交換執(zhí)行順序不影響(單線程)最終結果的時候熊镣,可能會把執(zhí)行順序改變但在多線程情況下情況比較復雜卑雁,比如單例模式雙重檢查鎖就存在這個問題,可以加上volatie關鍵字禁止cpu和jvm對當前操作的指令重排绪囱。

?????? 3.1指令重排是發(fā)生在那個階段呢测蹲?

??????? 答: 執(zhí)行器編譯階段也就是加載class文件編譯成字節(jié)碼的時候和cpu運行時也就是cpu執(zhí)行匯編指令時執(zhí)行的。

?????? 3.2通過插入屏障的方式來限制指令重排毕箍,屏障有 storeload寫讀屏障弛房,loadstore讀寫屏障,loadload讀讀屏障而柑,storestore寫寫屏障文捶,如下圖第一個a=1是volatile寫操作荷逞,第二個x=b是先volatile讀操作再普通寫操作,jvm會在中間插入寫讀屏障保證不被指令重排


?????? 3.3如果不使用volatile的時候怎么禁止指令重排呢?

?????? 答:java提供了一個類?Unsafe 的fullFence(),loadFence(),storeFence(),三個方法手動添加內存屏障粹排。

??? 4.原子性:volatie不能保證操作的原子性种远,原子性得通過關鍵字保證,原子性指一個操作是不可中斷的顽耳。即使是在多個線程一起執(zhí)行的時候坠敷,一個操作一旦開始,就不會被其他線程干擾射富。比如i++就不是一個原子性操作膝迎。


?? 5.總線風暴:總線風暴的產生就是從主內存到工作內存中如果開啟了緩存一致性協(xié)議的話,線程嗅探過多或者頻繁訪問工作內存過多就對引起胰耗,這時讀寫效率都將會大大下降

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末限次,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子柴灯,更是在濱河造成了極大的恐慌卖漫,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件赠群,死亡現場離奇詭異羊始,居然都是意外死亡,警方通過查閱死者的電腦和手機查描,發(fā)現死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門突委,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人叹誉,你說我怎么就攤上這事鸯两。” “怎么了长豁?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵钧唐,是天一觀的道長。 經常有香客問我匠襟,道長钝侠,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任酸舍,我火速辦了婚禮帅韧,結果婚禮上,老公的妹妹穿的比我還像新娘啃勉。我一直安慰自己忽舟,他們只是感情好,可當我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著叮阅,像睡著了一般刁品。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上浩姥,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天挑随,我揣著相機與錄音,去河邊找鬼勒叠。 笑死兜挨,一個胖子當著我的面吹牛,可吹牛的內容都是我干的眯分。 我是一名探鬼主播拌汇,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼弊决!你這毒婦竟也來了担猛?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤丢氢,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后先改,有當地人在樹林里發(fā)現了一具尸體疚察,經...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片让蕾。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡术奖,死狀恐怖,靈堂內的尸體忽然破棺而出广匙,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布夫椭,位于F島的核電站,受9級特大地震影響氯庆,放射性物質發(fā)生泄漏蹭秋。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一堤撵、第九天 我趴在偏房一處隱蔽的房頂上張望仁讨。 院中可真熱鬧,春花似錦实昨、人聲如沸洞豁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽丈挟。三九已至刁卜,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間礁哄,已是汗流浹背长酗。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留桐绒,地道東北人夺脾。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像茉继,于是被迫代替她去往敵國和親咧叭。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,713評論 2 354