Java并發(fā)機(jī)制的底層實(shí)現(xiàn)原理

Java代碼在編譯后會(huì)變成Java字節(jié)碼内舟,字節(jié)碼被類(lèi)加載器加載到JVM里墓塌,JVM執(zhí)行字節(jié)碼羹铅,最終需要轉(zhuǎn)化為匯編指令在CPU上執(zhí)行霞捡,Java中所使用的并發(fā)機(jī)制依賴于JVM的實(shí)現(xiàn)和CPU的指令坐漏。

volatile的理解

volatile是輕量級(jí)的synchronized,在多處理器開(kāi)發(fā)中保證了共享變量的“可見(jiàn)性”(當(dāng)一個(gè)線程修改一個(gè)共享變量時(shí)碧信,另一個(gè)線程可以能讀到這個(gè)修改的值)赊琳。相比synchronized使用的和執(zhí)行的成本低,因?yàn)樗粫?huì)引起線程上下文的切換和調(diào)度砰碴。

在volatile變量修飾的共享變量進(jìn)行寫(xiě)操作時(shí)躏筏,會(huì)在多核處理器下引發(fā)兩件事:

1.將當(dāng)前處理器緩存行的數(shù)據(jù)寫(xiě)回到系統(tǒng)內(nèi)存。
2.這個(gè)寫(xiě)回內(nèi)存操作會(huì)使其他CPU里緩存了該內(nèi)存地址的數(shù)據(jù)無(wú)效呈枉。

原因:為了提高處理的速度趁尼,處理器不會(huì)與內(nèi)存直接進(jìn)行通信,而是把數(shù)據(jù)寫(xiě)到內(nèi)部的緩存再進(jìn)行操作猖辫,之后酥泞,處理器不知道何時(shí)再寫(xiě)到內(nèi)存。如果對(duì)聲明了volatile變量進(jìn)行行寫(xiě)操作,JVM就會(huì)向處理器發(fā)送一條LOCK前綴的指令啃憎,將這個(gè)變量所在的緩存行的數(shù)據(jù)寫(xiě)回系統(tǒng)內(nèi)存芝囤。在多處理器下,為了保證各個(gè)處理器的緩存是一致的荧飞,就會(huì)實(shí)現(xiàn)緩存一致性協(xié)議凡人,每個(gè)處理器通過(guò)嗅探在總線上傳播的數(shù)據(jù)來(lái)檢查自己緩存的值是不是過(guò)期了,當(dāng)處理器發(fā)現(xiàn)自己緩存行對(duì)應(yīng)的內(nèi)存地址被修改叹阔,就會(huì)將當(dāng)前處理器的緩存行設(shè)置成無(wú)效狀態(tài)挠轴,當(dāng)處理器對(duì)這個(gè)數(shù)據(jù)進(jìn)行修改操作的時(shí)候,會(huì)重新從系統(tǒng)內(nèi)存中把數(shù)據(jù)讀到處理器緩存里耳幢。

synchronized的實(shí)現(xiàn)原理與應(yīng)用

Java中每個(gè)對(duì)象都可以作為鎖

  • 對(duì)于普通同步方法岸晦,鎖是當(dāng)前實(shí)例對(duì)象欧啤。
  • 對(duì)于靜態(tài)同步方法,鎖是當(dāng)前類(lèi)的Class對(duì)象启上。
  • 對(duì)于同步代碼塊邢隧,鎖是synchronized括號(hào)里的配置對(duì)象。
實(shí)現(xiàn)原理

從JVM規(guī)范中可以看到Synchonized在JVM里的實(shí)現(xiàn)原理冈在,JVM基于進(jìn)入和退出Monitor對(duì)象來(lái)實(shí)現(xiàn)方法同步和代碼塊同步倒慧,但兩者的實(shí)現(xiàn)細(xì)節(jié)不一樣。代碼塊同步是使用monitorenter和monitorexit指令實(shí)現(xiàn)的包券,而方法同步是使用另外一種方式實(shí)現(xiàn)的纫谅,細(xì)節(jié)在JVM規(guī)范里并沒(méi)有詳細(xì)說(shuō)明。但是溅固,方法的同步同樣可以使用這兩個(gè)指令來(lái)實(shí)現(xiàn)付秕。
monitorenter指令是在編譯后插入到同步代碼塊的開(kāi)始位置,而monitorexit是插入到方法結(jié)束處和異常處侍郭,JVM要保證每monitorenter必須有對(duì)應(yīng)的monitorexit與之配對(duì)询吴。任何對(duì)象都有一個(gè)monitor與之關(guān)聯(lián),當(dāng)且一個(gè)monitor被持有后亮元,它將處于鎖定狀態(tài)猛计。線程執(zhí)行到monitorenter指令時(shí),將會(huì)嘗試獲取對(duì)象所對(duì)應(yīng)的monitor的所有權(quán)爆捞,即嘗試獲得對(duì)象的鎖有滑。

鎖的升級(jí)與對(duì)比

在Java SE1.6 為了減少獲得鎖和釋放鎖帶來(lái)的性能消耗,引入了“偏向鎖”和“輕量級(jí)鎖”嵌削,其中所具有四種狀態(tài),級(jí)別依次從低往高為:無(wú)鎖狀態(tài)望艺、偏向鎖狀態(tài)苛秕、輕量級(jí)鎖狀態(tài)、重量級(jí)鎖狀態(tài)找默。(鎖可以升級(jí)不可降級(jí))

1.偏向鎖:

當(dāng)一個(gè)線程訪問(wèn)同步塊并獲取鎖時(shí)艇劫,會(huì)在對(duì)象頭和棧幀中的鎖記錄里存儲(chǔ)鎖偏向的線程ID,以后該線程在進(jìn)入和退出同步塊時(shí)不需要進(jìn)行CAS操作(CAS是英文單詞CompareAndSwap的縮寫(xiě)惩激,中文意思是:比較并替換店煞。CAS需要有3個(gè)操作數(shù):內(nèi)存地址V,舊的預(yù)期值A(chǔ)风钻,即將要更新的目標(biāo)值B顷蟀。CAS指令執(zhí)行時(shí),當(dāng)且僅當(dāng)內(nèi)存地址V的值與預(yù)期值A(chǔ)相等時(shí)骡技,將內(nèi)存地址V的值修改為B鸣个,否則就什么都不做羞反。整個(gè)比較并替換的操作是一個(gè)原子操作。)來(lái)加鎖和解鎖囤萤,只需簡(jiǎn)單地測(cè)試一下對(duì)象頭的Mark Word里是否存儲(chǔ)著指向當(dāng)前線程的偏向鎖昼窗。如果測(cè)試成功,表示線程已經(jīng)獲得了鎖涛舍。如果測(cè)試失敗澄惊,則需要再測(cè)試一下Mark Word中偏向鎖的標(biāo)識(shí)是否設(shè)置成1(表示當(dāng)前是偏向鎖):如果沒(méi)有設(shè)置,則使用CAS競(jìng)爭(zhēng)鎖富雅;如果設(shè)置了掸驱,則嘗試使用CAS將對(duì)象頭的偏向鎖指向當(dāng)前線程。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末吹榴,一起剝皮案震驚了整個(gè)濱河市亭敢,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌图筹,老刑警劉巖帅刀,帶你破解...
    沈念sama閱讀 223,002評(píng)論 6 519
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異远剩,居然都是意外死亡扣溺,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,357評(píng)論 3 400
  • 文/潘曉璐 我一進(jìn)店門(mén)瓜晤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)锥余,“玉大人,你說(shuō)我怎么就攤上這事痢掠∏蹋” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,787評(píng)論 0 365
  • 文/不壞的土叔 我叫張陵足画,是天一觀的道長(zhǎng)雄驹。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,237評(píng)論 1 300
  • 正文 為了忘掉前任翁涤,我火速辦了婚禮逃顶,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,237評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布霞怀。 她就那樣靜靜地躺著,像睡著了一般等曼。 火紅的嫁衣襯著肌膚如雪里烦。 梳的紋絲不亂的頭發(fā)上凿蒜,一...
    開(kāi)封第一講書(shū)人閱讀 52,821評(píng)論 1 314
  • 那天,我揣著相機(jī)與錄音胁黑,去河邊找鬼废封。 笑死,一個(gè)胖子當(dāng)著我的面吹牛丧蘸,可吹牛的內(nèi)容都是我干的漂洋。 我是一名探鬼主播,決...
    沈念sama閱讀 41,236評(píng)論 3 424
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼力喷,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼刽漂!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起弟孟,我...
    開(kāi)封第一講書(shū)人閱讀 40,196評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤贝咙,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后拂募,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體庭猩,經(jīng)...
    沈念sama閱讀 46,716評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,794評(píng)論 3 343
  • 正文 我和宋清朗相戀三年陈症,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蔼水。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,928評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡录肯,死狀恐怖趴腋,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情论咏,我是刑警寧澤优炬,帶...
    沈念sama閱讀 36,583評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站厅贪,受9級(jí)特大地震影響穿剖,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜卦溢,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,264評(píng)論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望秀又。 院中可真熱鬧单寂,春花似錦、人聲如沸吐辙。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,755評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)昏苏。三九已至尊沸,卻和暖如春威沫,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背洼专。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,869評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工棒掠, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人屁商。 一個(gè)月前我還...
    沈念sama閱讀 49,378評(píng)論 3 379
  • 正文 我出身青樓烟很,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親蜡镶。 傳聞我的和親對(duì)象是個(gè)殘疾皇子雾袱,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,937評(píng)論 2 361

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