<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    卓凡

     

    (轉(zhuǎn))Java輕量級(jí)鎖原理詳解(Lightweight Locking)

    大家知道,Java的多線程安全是基于Lock機(jī)制實(shí)現(xiàn)的,而Lock的性能往往不如人意。
    原因是,monitorenter與monitorexit這兩個(gè)控制多線程同步的bytecode原語,是JVM依賴操作系統(tǒng)互斥(mutex)來實(shí)現(xiàn)的。
    互斥是一種會(huì)導(dǎo)致線程掛起,并在較短的時(shí)間內(nèi)又需要重新調(diào)度回原線程的,較為消耗資源的操作。

    為了優(yōu)化Java的Lock機(jī)制,從Java6開始引入了輕量級(jí)鎖的概念。

    輕量級(jí)鎖(Lightweight Locking)本意是為了減少多線程進(jìn)入互斥的幾率,并不是要替代互斥。
    它利用了CPU原語Compare-And-Swap(CAS,匯編指令CMPXCHG),嘗試在進(jìn)入互斥前,進(jìn)行補(bǔ)救。

    本文將詳細(xì)介紹JVM如何利用CAS,實(shí)現(xiàn)輕量級(jí)鎖。

     

    原理詳解

    Java Object Model中定義,Object Header是一個(gè)2字(1 word = 4 byte)長度的存儲(chǔ)區(qū)域。
    第一個(gè)字長度的區(qū)域用來標(biāo)記同步,GC以及hash code等,官方稱之為 mark word。第二個(gè)字長度的區(qū)域是指向到對(duì)象的Class。

    在2個(gè)word中,mark word是輕量級(jí)鎖實(shí)現(xiàn)的關(guān)鍵。它的結(jié)構(gòu)見下表

    從表中可以看到,state為lightweight locked的那行即為輕量級(jí)鎖標(biāo)記。bitfieds名為指向lock record的指針,這里的lock record,其實(shí)是一塊分配在線程堆棧上的空間區(qū)域
    用于CAS前,拷貝object上的mark word(為什么要拷貝,請(qǐng)看下文)。
    第三項(xiàng)是重量級(jí)鎖標(biāo)記。后面的狀態(tài)單詞很有趣,inflated,譯為膨脹,在這里意思其實(shí)是鎖已升級(jí)到OS-level。
    在本文的范圍內(nèi),我們只關(guān)注第二和第三項(xiàng)即可。

    為了能直觀的理解lock,unlock與mark word之間的聯(lián)系,我畫了一張流程圖:

    在圖中,提到了拷貝object mark word,由于脫離了原始mark word,官方將它冠以displaced前綴,即displaced mark word(置換標(biāo)記字)。
    這個(gè)displaced mark word是整個(gè)輕量級(jí)鎖實(shí)現(xiàn)的關(guān)鍵,在CAS中的compare就需要用它作為條件。

    為什么要拷貝mark word?
    其實(shí)很簡單,原因是為了不想在lock與unlock這種底層操作上再加同步。

    在拷貝完object mark word之后,JVM做了一步交換指針的操作,即流程中第一個(gè)橙色矩形框內(nèi)容所述。
    將object mark word里的輕量級(jí)鎖指針指向lock record所在的stack指針,作用是讓其他線程知道,該object monitor已被占用。
    lock record里的owner指針指向object mark word的作用是為了在接下里的運(yùn)行過程中,識(shí)別哪個(gè)對(duì)象被鎖住了。

    下圖直觀地描述了交換指針的操作。

    exchange_pointer_1

    最后一步unlock中,我們發(fā)現(xiàn),JVM同樣使用了CAS來驗(yàn)證object mark word在持有鎖到釋放鎖之間,有無被其他線程訪問。
    如果其他線程在持有鎖這段時(shí)間里,嘗試獲取過鎖,則可能自身被掛起,而mark word的重量級(jí)鎖指針也會(huì)被相應(yīng)修改。
    此時(shí),unlock后就需要喚醒被掛起的線程。

    原文鏈接:http://kenwublog.com/theory-of-lightweight-locking-upon-cas

    posted on 2010-01-08 17:59 卓凡 閱讀(266) 評(píng)論(0)  編輯  收藏 所屬分類: core java

    導(dǎo)航

    統(tǒng)計(jì)

    常用鏈接

    留言簿

    隨筆檔案

    文章分類

    文章檔案

    搜索

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 免费看黄视频网站| 久久久久久曰本AV免费免费| 国产高清免费的视频| 亚洲一区二区三区无码国产| 91福利免费视频| 亚洲美免无码中文字幕在线| 91久久精品国产免费一区| 久久亚洲熟女cc98cm| 222www免费视频| 国产成人亚洲精品| 亚洲AV无码一区二区三区DV| 国产高清视频免费在线观看 | 香蕉97超级碰碰碰免费公| 亚洲AV无码一区二区三区在线| 日韩吃奶摸下AA片免费观看| 亚洲日本乱码卡2卡3卡新区| 国语成本人片免费av无码| 亚洲爆乳成av人在线视菜奈实 | 三年片免费高清版 | 亚洲国产精品久久久久| 黄+色+性+人免费| 亚洲精品国产suv一区88| 免费精品国产自产拍观看| 成人特级毛片69免费观看| 精品亚洲永久免费精品| 最好看的中文字幕2019免费| 亚洲中文字幕无码一去台湾| 日本免费无遮挡吸乳视频电影| 色老头综合免费视频| 亚洲人成在线观看| 成年女性特黄午夜视频免费看 | 亚洲人成亚洲精品| 日韩在线天堂免费观看| 一区二区三区视频免费观看| 亚洲成色在线综合网站| 天天摸夜夜摸成人免费视频| 好猛好深好爽好硬免费视频 | 亚洲日产乱码一二三区别| 亚洲AV日韩精品一区二区三区 | 九月丁香婷婷亚洲综合色| 日韩版码免费福利视频|