Java并發(fā)

并發(fā)的挑戰(zhàn)

上下文切換: 是消耗資源的操作,進(jìn)入內(nèi)核態(tài)需要

資源限制 : ?I/O 數(shù)據(jù)庫盯串,cpu核數(shù)

死鎖 :等待不到需要的資源

volatile

內(nèi)存語義

當(dāng)寫一個volatile變量時,JMM會把該線程對應(yīng)的本地內(nèi)存中的共享變量值刷新到主內(nèi)存中富蓄。當(dāng)讀一個volatile變量時车吹,JMM會把該線程對應(yīng)的本地內(nèi)存置為無效,線程接下來將從主內(nèi)存中讀取共享變量

硬件實現(xiàn)

使用硬件指令當(dāng)前緩存行刷入主內(nèi)存

是其他緩存中此變量的緩存行無效

使得讀操作需要重新從主內(nèi)存加載此變量

適用場景

只有一個線程對volatile變量寫

Synchronized

鎖的對象

Java中的每一個對象都可以作為鎖抖僵。

對于同步方法,鎖是當(dāng)前實例對象缘揪。

對于靜態(tài)同步方法耍群,鎖是當(dāng)前對象的Class對象。

對于同步方法塊找筝,鎖是Synchonized括號里配置的對象

實現(xiàn)

同步方法

使用 ACC_SYNCHRONIZED 標(biāo)記符隱示的實現(xiàn)蹈垢,原理是通過方法調(diào)用指令檢查該方法在常量池中是否包含 ACC_SYNCHRONIZED 標(biāo)記符,JVM 要求線程在調(diào)用之前請求鎖

同步代碼塊

JVM通過monitorenter和monitorexist指令實現(xiàn)同步鎖的獲取和釋放功能

monitorenter指令是在編譯后插入到同步代碼塊的開始位置

monitorexit指令是插入到方法結(jié)束處和異常處

JVM要保證每個monitorenter必須有對應(yīng)的monitorexit與之配對

任何對象都有一個monitor與之關(guān)聯(lián)袖裕,當(dāng)且一個monitor被持有后曹抬,它將處于鎖定狀態(tài)

線程執(zhí)行monitorenter指令時,將會嘗試獲取對象所對應(yīng)的monitor的所有權(quán)急鳄,即嘗試獲得對象的鎖

線程執(zhí)行monitorexit指令時谤民,將會將進(jìn)入次數(shù)-1直到變成0時釋放監(jiān)視器

同一時刻只有一個線程能夠成功,其它失敗的線程會被阻塞疾宏,并放入到同步隊列中张足,進(jìn)入BLOCKED狀態(tài)

虛擬機(jī)做的鎖優(yōu)化

1.鎖消除,消除無謂的鎖

2.鎖粗化坎藐,合并太小粒度的加鎖

3.鎖自旋为牍,自適應(yīng)自旋

4.鎖膨脹

鎖膨脹

Java對象頭

偏向鎖

為了在無多線程競爭的情況下盡量減少不必要的輕量級鎖執(zhí)行路徑

,而偏向鎖則是在只有一個線程執(zhí)行同步塊時進(jìn)一步提高性能



輕量級鎖

目的是沒有多線程競爭的前提下,減少傳統(tǒng)的重量級鎖

輕量級鎖是為了在線程交替執(zhí)行同步塊時提高性能



重量級鎖實現(xiàn)

Monitor Record結(jié)構(gòu)

MonitorRecord(統(tǒng)一簡稱MR)是Java線程私有的數(shù)據(jù)結(jié)構(gòu)碉咆,每一個線程都有一個可用MR列表抖韩,同時還有一個全局的可用列表

一個被鎖住的對象都會和一個MR關(guān)聯(lián)(對象頭的MarkWord中的LockWord指向MR的起始地址)

MR中有一個Owner字段存放擁有該鎖的線程的唯一標(biāo)識,表示該鎖被這個線程占用

Monitor Record工作機(jī)理


線程如果獲得監(jiān)視鎖成功吟逝,將成為該監(jiān)視鎖對象的擁有者

在任一時刻帽蝶,監(jiān)視器對象只屬于一個活動線程(Owner)

擁有者可以調(diào)用wait方法自動釋放監(jiān)視鎖赦肋,進(jìn)入等待狀態(tài)

AQS

原子操作

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末块攒,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子佃乘,更是在濱河造成了極大的恐慌囱井,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件趣避,死亡現(xiàn)場離奇詭異庞呕,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)程帕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進(jìn)店門住练,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人愁拭,你說我怎么就攤上這事讲逛。” “怎么了岭埠?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵盏混,是天一觀的道長。 經(jīng)常有香客問我惜论,道長许赃,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任馆类,我火速辦了婚禮混聊,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘乾巧。我一直安慰自己句喜,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布卧抗。 她就那樣靜靜地躺著藤滥,像睡著了一般。 火紅的嫁衣襯著肌膚如雪社裆。 梳的紋絲不亂的頭發(fā)上拙绊,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼标沪。 笑死榄攀,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的金句。 我是一名探鬼主播檩赢,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼违寞!你這毒婦竟也來了贞瞒?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤趁曼,失蹤者是張志新(化名)和其女友劉穎军浆,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體挡闰,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡乒融,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了摄悯。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片赞季。...
    茶點故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖奢驯,靈堂內(nèi)的尸體忽然破棺而出申钩,到底是詐尸還是另有隱情,我是刑警寧澤叨橱,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布典蜕,位于F島的核電站,受9級特大地震影響罗洗,放射性物質(zhì)發(fā)生泄漏愉舔。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一伙菜、第九天 我趴在偏房一處隱蔽的房頂上張望轩缤。 院中可真熱鬧,春花似錦贩绕、人聲如沸火的。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽馏鹤。三九已至,卻和暖如春娇哆,著一層夾襖步出監(jiān)牢的瞬間湃累,已是汗流浹背勃救。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留治力,地道東北人蒙秒。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像宵统,于是被迫代替她去往敵國和親晕讲。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,781評論 2 354

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