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

volatile的應(yīng)用

  • valatile實(shí)現(xiàn)原則
    • Lock前綴指令會(huì)引起處理器緩存回寫到內(nèi)存
    • 一個(gè)處理器的緩存回寫到內(nèi)存會(huì)導(dǎo)致其他處理器的緩存無效
  • volatile的使用優(yōu)化
    • 追加字節(jié)64字節(jié)的方式來優(yōu)化性能(Java 7下可能不生效褥伴,采用了其他追加字節(jié)的方式)

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

相信絕大數(shù)人在腦海里對(duì)synchronized的第一印象就是重量級(jí)鎖濒翻,性能消耗特別高牵寺,不到萬不得一最好不要使用synchronized疼进,當(dāng)然了焦匈,在1.6版本之前確實(shí)是這樣的,但是在1.6版本對(duì)synchronized進(jìn)行了優(yōu)化,其中最主要的就是引入了偏向鎖、輕量級(jí)鎖雀鹃。后續(xù)會(huì)有所提及。

  • 對(duì)于普通同步方法励两,鎖是當(dāng)前實(shí)例對(duì)象
  • 對(duì)于靜態(tài)同步方法黎茎,鎖是當(dāng)前類的Class對(duì)象
  • 對(duì)于同步方法塊,鎖是synchronized括號(hào)里配置的對(duì)象

記住synchronized是通過JVM實(shí)現(xiàn)的当悔,如果修飾的同步塊傅瞻,與之對(duì)應(yīng)的命令monitorentermonitorexit。如果是同步方法盲憎,則是依靠方法修飾符上的ACC_SYNCHRONIZED

  • Java對(duì)象頭

Java對(duì)象頭的存儲(chǔ)結(jié)構(gòu)(32位JVM)

鎖狀態(tài) 25bit 4bit 1bit(偏向鎖) 2bit(鎖標(biāo)志位)
無鎖狀態(tài) 對(duì)象的hashCode 對(duì)象分代年齡 0 01

Java對(duì)象頭的存儲(chǔ)結(jié)構(gòu)(64位JVM)
不支持HTML標(biāo)簽嗅骄,只能截圖了


image.png
  • 鎖級(jí)別(由低到高)

無鎖狀態(tài)->偏向鎖狀態(tài)->輕量級(jí)鎖狀態(tài)->重量級(jí)鎖狀態(tài)(只能升級(jí)不能降級(jí))

偏向鎖

初次獲取鎖的時(shí)候,將自身的ThreadID寫入到mark word的ThreadId字段內(nèi)饼疙,并且將偏向鎖的狀態(tài)置為1掸读。如果再有線程來獲取鎖的時(shí)候,直接比較ThreadID是否一致宏多。

輕量級(jí)鎖

兩個(gè)線程競(jìng)爭,其中只會(huì)有一個(gè)競(jìng)爭成功澡罚,另外一個(gè)進(jìn)行自旋CAS伸但。

鎖的優(yōu)缺點(diǎn)對(duì)比及適用場(chǎng)景

優(yōu)點(diǎn) 缺點(diǎn) 適用場(chǎng)景
偏向鎖 加鎖和解鎖不需要額外的消耗,和執(zhí)行非同步方法相比僅存在納秒級(jí)的差距 如果線程間存在鎖競(jìng)爭留搔,會(huì)帶來額外的鎖撤銷的消耗 使用只有一個(gè)線程訪問同步塊場(chǎng)景
輕量級(jí)鎖 競(jìng)爭的線程不會(huì)阻塞更胖,提高了程序的響應(yīng)速度 如果始終得不到鎖競(jìng)爭的線程,使用自旋會(huì)消耗CPU 追求響應(yīng)時(shí)間隔显,同步塊執(zhí)行速度非橙捶粒快
重量級(jí)鎖 線程競(jìng)爭不適用自旋,不會(huì)消耗CPU 線程阻塞括眠,響應(yīng)時(shí)間緩慢 追求吞吐量彪标,同步塊執(zhí)行速度較長

原子操作的實(shí)現(xiàn)原理

  • 如何實(shí)現(xiàn)原子性

    • 使用總線鎖保證原子性(使用處理器提供的Lock #信號(hào),當(dāng)一個(gè)處理器在總線上輸出此信號(hào)時(shí)掷豺,其他處理器的請(qǐng)求將被阻塞住捞烟,所以開銷比較大)
    • 使用緩存鎖保證原子性(修改內(nèi)部的內(nèi)存地址薄声,通過緩存一致性機(jī)制來保證操作的原子性,因?yàn)榫彺嬉恢滦詸C(jī)制會(huì)阻止同時(shí)修改由兩個(gè)以上處理器緩存的內(nèi)存區(qū)域數(shù)據(jù)题画,當(dāng)其他處理器回寫已被鎖定的緩存行的數(shù)據(jù)時(shí)默辨,會(huì)使緩存行無效)
      • 有兩種特殊情況處理器不會(huì)使用緩存鎖定
        • 當(dāng)操作的數(shù)據(jù)不能被緩存在處理器內(nèi)部或操作的數(shù)據(jù)跨多個(gè)緩存行時(shí),則會(huì)調(diào)用總線鎖定
        • 有些處理器不支持緩存鎖定苍息。(Intel 486和Pentium處理器)
  • Java如何實(shí)現(xiàn)原子操作

    • 實(shí)現(xiàn)方式
      • 自旋CAS
    • 鎖機(jī)制實(shí)現(xiàn)原子操作
      JVM內(nèi)部多種鎖機(jī)制:偏向鎖缩幸、輕量級(jí)鎖、互斥鎖竞思。除了偏向鎖表谊,其它都用到了CAS
    • CAS實(shí)現(xiàn)原理及存在的問題
      • JVM中的CAS操作是利用處理器提供的CMPXCHG指令實(shí)現(xiàn)的
      • CAS實(shí)現(xiàn)原子操作的三大問題
        1. ABA問題(1.5版本提供的AtomicStampedReference來解決的)
        2. 循環(huán)時(shí)間長,開銷大(如果處理器支持pause命令衙四,效率有所提升铃肯。第一,延遲流水線執(zhí)行命令传蹈,使CPU不會(huì)消耗過多的執(zhí)行資源押逼。第二,避免循環(huán)推出的時(shí)候因內(nèi)存順序沖突而引起CPU流水線被清空惦界,從而提高CPU的執(zhí)行效率)
        3. 只能保證一個(gè)共享變量的原子操作(1.5版本提供的AtomicReference類來保證引用對(duì)象之間的原子性挑格,就可以把多個(gè)變量放在一個(gè)對(duì)象里來進(jìn)行CAS操作)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市沾歪,隨后出現(xiàn)的幾起案子漂彤,更是在濱河造成了極大的恐慌,老刑警劉巖灾搏,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件挫望,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡狂窑,警方通過查閱死者的電腦和手機(jī)媳板,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來泉哈,“玉大人蛉幸,你說我怎么就攤上這事〈曰蓿” “怎么了奕纫?”我有些...
    開封第一講書人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長烫沙。 經(jīng)常有香客問我匹层,道長,這世上最難降的妖魔是什么锌蓄? 我笑而不...
    開封第一講書人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任又固,我火速辦了婚禮仲器,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘仰冠。我一直安慰自己乏冀,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開白布洋只。 她就那樣靜靜地躺著辆沦,像睡著了一般。 火紅的嫁衣襯著肌膚如雪识虚。 梳的紋絲不亂的頭發(fā)上肢扯,一...
    開封第一講書人閱讀 51,301評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音担锤,去河邊找鬼蔚晨。 笑死,一個(gè)胖子當(dāng)著我的面吹牛肛循,可吹牛的內(nèi)容都是我干的铭腕。 我是一名探鬼主播,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼多糠,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼累舷!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起夹孔,我...
    開封第一講書人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤被盈,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后搭伤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體只怎,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年怜俐,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了身堡。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡佑菩,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出裁赠,到底是詐尸還是另有隱情殿漠,我是刑警寧澤,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布佩捞,位于F島的核電站绞幌,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏一忱。R本人自食惡果不足惜莲蜘,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一谭确、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧票渠,春花似錦逐哈、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至杜窄,卻和暖如春肠骆,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背塞耕。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來泰國打工蚀腿, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人扫外。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓莉钙,卻偏偏與公主長得像,于是被迫代替她去往敵國和親畏浆。 傳聞我的和親對(duì)象是個(gè)殘疾皇子胆胰,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

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