一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

synchronized的鎖膨脹

科技綠洲 ? 來(lái)源:Java技術(shù)指北 ? 作者:Java技術(shù)指北 ? 2023-10-10 16:58 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

初識(shí)

synchronized 可以加在方法和類(lèi)上面,作用于類(lèi)和對(duì)象。下面代碼中列出了 synchronized 的用法。

public class SynchronizedTest {

    public static final Object lock = new Object();

    // 鎖的是SynchronizedTest.class對(duì)象
    public static synchronized void sync1() {

    }

    // 鎖的是SynchronizedTest.class對(duì)象
    public static void sync2() {
        synchronized (SynchronizedTest.class) {

        }
    }

    // 鎖的是當(dāng)前實(shí)例this
    public synchronized void sync3() {

    }

    // 鎖的是當(dāng)前實(shí)例this
    public void sync4() {
        synchronized (this) {

        }
    }

    // 鎖的是指定對(duì)象lock
    public void sync5() {
        synchronized (lock) {

        }
    }
}

synchronized 大家都知道是用 monitorenter 和 monitorexit 兩個(gè)指令鎖住同步塊的。

那么 synchronized 是怎么膨脹的呢?為什么會(huì)膨脹呢?

先從 JVM 內(nèi)存開(kāi)始講起,對(duì)象在被實(shí)例化后,是存放在堆內(nèi)存中的,它由 3 部分組成:

  1. 對(duì)象頭:存放對(duì)象運(yùn)行時(shí)的狀態(tài)的信息、指向該對(duì)象所屬 Class 的元數(shù)據(jù)的指針。
  2. 實(shí)例數(shù)據(jù):存放對(duì)象的屬性數(shù)據(jù)信息,包括父類(lèi)的信息。
  3. 對(duì)齊填充字節(jié):由于虛擬機(jī)要求對(duì)象的大小必須是 8 字節(jié)的整數(shù)倍。不是必須存在,僅僅是為了字節(jié)對(duì)齊。

其中對(duì)象頭里面包含了 Mark Word(標(biāo)記字段)和 Class Pointer(類(lèi)型指針)

圖片

  1. Mark Word 默認(rèn)的存儲(chǔ)對(duì)象的 hashcode、分代年齡、是否偏向鎖、鎖標(biāo)識(shí)位的信息,它在運(yùn)行期間的存儲(chǔ)內(nèi)容會(huì)隨著鎖的變化而變化。
Mark Word (32 bits)是否偏向鎖鎖標(biāo)識(shí)位值鎖狀態(tài)
對(duì)象的hashcode(25)、分代年齡(4)、是否偏向鎖(1)、鎖標(biāo)識(shí)位(2)001無(wú)鎖
線(xiàn)程ID(23)、偏向時(shí)間戳(2)、分代年齡(4)、是否偏向鎖(1)、鎖標(biāo)識(shí)位(2)101偏向鎖
指向棧中鎖記錄的指針(30)、鎖標(biāo)識(shí)位(2)00輕量級(jí)鎖
指向重量級(jí)鎖的指針(30)、鎖標(biāo)識(shí)位(2)10重量級(jí)鎖
  1. Class Pointer(類(lèi)型指針):對(duì)象指向類(lèi)的元數(shù)據(jù)的指針,虛擬機(jī)通過(guò)這個(gè)指針來(lái)確定對(duì)象是哪一個(gè)類(lèi)的實(shí)例。

鎖膨脹

偏向鎖、輕量級(jí)鎖、重量級(jí)鎖、自旋鎖,這些都是Synchronzied的鎖的實(shí)現(xiàn)。Synchrozied會(huì)根據(jù)不同的場(chǎng)景選擇不同的鎖,我們只使用Synchronzied,不用關(guān)心它具體使用的哪個(gè)鎖。

偏向鎖

java 程序中,大多數(shù)情況不存在多個(gè)線(xiàn)程同時(shí)競(jìng)爭(zhēng)鎖,往往都是同一個(gè)線(xiàn)程多次獲得同一個(gè)鎖。

當(dāng)只有一個(gè)線(xiàn)程在競(jìng)爭(zhēng)鎖的時(shí)候,在線(xiàn)程獲取到鎖后,將進(jìn)入偏向模式,程序會(huì)將對(duì)象的頭的前 23 個(gè)字節(jié)用 CAS 的方式存儲(chǔ)線(xiàn)程 ID。下次有線(xiàn)程競(jìng)爭(zhēng)鎖,只需要比較對(duì)象頭中的線(xiàn)程 ID 是不是和此時(shí)獲取到鎖的線(xiàn)程 ID 相同。如果相同線(xiàn)程就直接進(jìn)入同步代碼塊,不需要 CAS 競(jìng)爭(zhēng)鎖。

圖片

有另外的線(xiàn)程在競(jìng)爭(zhēng)鎖的時(shí)候,持有偏向鎖的線(xiàn)程才會(huì)釋放鎖,持有偏向鎖的線(xiàn)程不會(huì)主動(dòng)釋放偏向鎖。偏向鎖的撤銷(xiāo),是在沒(méi)有字節(jié)碼執(zhí)行的時(shí)候進(jìn)行的。首先會(huì)暫停偏向鎖的線(xiàn)程,判斷鎖對(duì)象是否被鎖住。撤銷(xiāo)偏向鎖后恢復(fù)成無(wú)鎖或者是輕量級(jí)鎖。

輕量級(jí)鎖

當(dāng)有另外的線(xiàn)程在競(jìng)爭(zhēng)偏向鎖的時(shí)候并且競(jìng)爭(zhēng)失敗了,偏向鎖就會(huì)膨脹為輕量級(jí)鎖,其他的線(xiàn)程會(huì)通過(guò)自旋的方式嘗試獲取鎖。

JVM 會(huì)在當(dāng)前線(xiàn)程的棧幀中創(chuàng)建一個(gè)叫做鎖記錄(Lock Record)的空間,將鎖對(duì)象的 Mark Word 復(fù)制進(jìn)去。這個(gè)官方稱(chēng)為 Displaced Mard Word。然后 JVM 將使用 CAS 操作嘗試將鎖對(duì)象的Mark Word 更新為指向 Lock Record 的指針。如果更新成功,鎖標(biāo)識(shí)位就成為 00,此時(shí)為輕量級(jí)鎖。

圖片

重量級(jí)鎖

從上面的表格中就指出重量級(jí)鎖的對(duì)象頭里面存儲(chǔ)的是指向 monitor 的指針,那 monitor 是什么呢?

monitor 又稱(chēng)為管程,Java 中由 ObjectMonitor 實(shí)現(xiàn)。當(dāng)線(xiàn)程要將對(duì)象加鎖的時(shí)候,對(duì)象會(huì)創(chuàng)建一個(gè)monitor。

圖片

ObjectMonitor 主要的字段有:

  1. owner:就是當(dāng)前加鎖的線(xiàn)程
  2. waitSet:就是 owner的線(xiàn)程調(diào)用了 wait() 方法,就進(jìn)入這個(gè)里面
  3. entryList:加鎖失敗的線(xiàn)程阻塞在這個(gè)里面
  4. recursions:鎖的重入次數(shù)
  5. count:用來(lái)記錄是不是有對(duì)象加鎖:0.當(dāng)前對(duì)象沒(méi)有線(xiàn)程加鎖,1. 當(dāng)前對(duì)象有線(xiàn)程加鎖

從輕量級(jí)鎖升級(jí)到重量級(jí)鎖的時(shí)候,對(duì)象頭 Mark Word 存儲(chǔ)已經(jīng)變成了指向 Monitor 的指針。線(xiàn)程可以通過(guò)這個(gè)指針找到 ObjectMonitor,放入 entryList 等待重量級(jí)鎖釋放后競(jìng)爭(zhēng)。entryList 中的線(xiàn)程 CAS 嘗試更新 count = 1,當(dāng)更新成功后將 owner 設(shè)置為當(dāng)前的線(xiàn)程。當(dāng) owner 的線(xiàn)程調(diào)用了 wait() 方法,線(xiàn)程就會(huì)釋放鎖,進(jìn)入 waitSet 中。這個(gè)時(shí)候 count = 1,owner = null,entryList 的線(xiàn)程可以再次競(jìng)爭(zhēng)鎖。

圖片

總結(jié)

  1. synchronized 不管是加在類(lèi)上還是方法上,如果作用在類(lèi)上,這個(gè)類(lèi)的所有對(duì)象都是同一把鎖,
  2. 鎖膨脹時(shí)不可以降級(jí)的
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 內(nèi)存
    +關(guān)注

    關(guān)注

    8

    文章

    3125

    瀏覽量

    75280
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4900

    瀏覽量

    70768
  • JVM
    JVM
    +關(guān)注

    關(guān)注

    0

    文章

    160

    瀏覽量

    12629
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    MATLAB2013中Synchronized 6-Pulse Generator在哪兒

    MATLAB2013中Synchronized 6-Pulse Generator在哪兒著實(shí)找不到
    發(fā)表于 04-19 11:47

    電子膨脹閥如何驅(qū)動(dòng)

    `電子膨脹閥的驅(qū)動(dòng)方式是控制器通過(guò)對(duì)傳感器采集得到的參數(shù)進(jìn)行計(jì)算,向驅(qū)動(dòng)板發(fā)出調(diào)節(jié)指令,由驅(qū)動(dòng)板向電子膨脹閥輸出電信號(hào),驅(qū)動(dòng)電子膨脹閥的動(dòng)作。電子膨脹閥從全閉到全開(kāi)狀態(tài)其用時(shí)僅需幾秒鐘
    發(fā)表于 04-29 15:10

    電子膨脹閥的介紹

    一、電子膨脹閥的介紹電子膨脹閥是一種可按預(yù)設(shè)程序調(diào)節(jié)進(jìn)入制冷裝置的制冷劑流量的節(jié)流元件。在一些負(fù)荷變化較劇烈或運(yùn)行工況范圍較寬的場(chǎng)合,傳統(tǒng)的節(jié)流元件(如毛細(xì)管、熱力膨脹閥等)已不能滿(mǎn)足舒適...
    發(fā)表于 02-17 06:48

    電池膨脹原因分析

    電池膨脹原因分析 一般電池電池膨脹的主要原因是:
    發(fā)表于 10-21 10:41 ?1186次閱讀

    Synchronized multi-spark modul

    Synchronized multi-spark module (SMSM) for Electronic Ignition Devices (EID)
    發(fā)表于 12-29 09:09 ?896次閱讀
    <b class='flag-5'>Synchronized</b> multi-spark modul

    熱力膨脹閥的分類(lèi)及有什么區(qū)別_熱力膨脹閥怎么調(diào)節(jié)(工作原理及作用)

    本文以熱力膨脹閥為中心,主要介紹了什么是熱力膨脹閥,熱力膨脹閥的結(jié)構(gòu)、作用與工作原理。詳細(xì)的說(shuō)明了熱力膨脹閥的分類(lèi)及區(qū)別分析。最后說(shuō)明了熱力膨脹
    發(fā)表于 12-26 11:03 ?3.3w次閱讀
    熱力<b class='flag-5'>膨脹</b>閥的分類(lèi)及有什么區(qū)別_熱力<b class='flag-5'>膨脹</b>閥怎么調(diào)節(jié)(工作原理及作用)

    電子膨脹閥如何選型_電子膨脹閥5線(xiàn)怎樣區(qū)分

    本文首先介紹了電子膨脹閥的原理,其次介紹了電子膨脹閥的選型表及電子膨脹閥5線(xiàn)的區(qū)分,最后介紹了電子膨脹閥的兩個(gè)典型應(yīng)用。
    的頭像 發(fā)表于 05-25 16:22 ?4.6w次閱讀
    電子<b class='flag-5'>膨脹</b>閥如何選型_電子<b class='flag-5'>膨脹</b>閥5線(xiàn)怎樣區(qū)分

    國(guó)內(nèi)智能市場(chǎng)急劇膨脹,企業(yè)做好突圍準(zhǔn)備勢(shì)在必行

    近幾年,智能的市場(chǎng)發(fā)展態(tài)勢(shì)一片大好,特別是在剛過(guò)去的2017年,國(guó)內(nèi)智能市場(chǎng)急劇膨脹,上千品牌如雨后春筍般冒出,然而在這樣的情況下,眾多品牌卻無(wú)法被市場(chǎng)所消化。所以, 2018年,對(duì)智能
    發(fā)表于 10-25 14:45 ?553次閱讀

    為何膨脹螺絲可以固定得那么牢固

    很小,從而使墻體、膨脹管及圓錐間形成摩擦自,進(jìn)而達(dá)到固定作用。 膨脹螺絲上的彈簧墊是標(biāo)準(zhǔn)零件,因?yàn)樗拈_(kāi)口錯(cuò)開(kāi)并具有彈性,所以叫做彈簧墊圈,彈簧墊圈的作用是利用錯(cuò)口的銳利尖角刺入螺母和平墊中,防止螺母松動(dòng)。
    的頭像 發(fā)表于 09-27 10:23 ?4131次閱讀

    Java并發(fā)編程中線(xiàn)程同步的常用手段synchronized用法

    synchronized關(guān)鍵字是Java并發(fā)編程中線(xiàn)程同步的常用手段之一,其作用有三個(gè): 互斥性:確保線(xiàn)程互斥的訪(fǎng)問(wèn)同步代,自動(dòng)釋放,多個(gè)線(xiàn)程操作同個(gè)代碼塊或函數(shù)必須排隊(duì)獲得, 可見(jiàn)性:保證共享
    的頭像 發(fā)表于 04-04 11:30 ?1364次閱讀
    Java并發(fā)編程中線(xiàn)程同步的常用手段<b class='flag-5'>synchronized</b>用法

    詳細(xì)介紹synchronized和Object的關(guān)鍵方法和虛擬機(jī)實(shí)現(xiàn)原理

    編程過(guò)程中經(jīng)常會(huì)遇到線(xiàn)程的同步問(wèn)題,Java 中對(duì)同步問(wèn)題的解決方案比較多(synchronized、JUC、原子操作、volatile、條件變量等),其中synchronized 最方便、簡(jiǎn)單易用,也是java 編程中使用最多的臨界區(qū)保護(hù)方案。
    的頭像 發(fā)表于 03-13 10:06 ?1519次閱讀

    synchronized知識(shí)合集1

    * synchronized關(guān)鍵字底層原理 * synchronized修飾實(shí)例方法 * monitor是什么? * Java對(duì)象內(nèi)存布局 * synchroni
    的頭像 發(fā)表于 05-11 11:07 ?625次閱讀
    <b class='flag-5'>synchronized</b>知識(shí)合集1

    synchronized知識(shí)合集2

    * synchronized關(guān)鍵字底層原理 * synchronized修飾實(shí)例方法 * monitor是什么? * Java對(duì)象內(nèi)存布局 * synchroni
    的頭像 發(fā)表于 05-11 11:08 ?572次閱讀

    synchronized的原理與四種用法介紹

    JDK提供的分兩種,一種是JVM實(shí)現(xiàn)的synchronized,是java的關(guān)鍵字,因此在這個(gè)關(guān)鍵字作用對(duì)象的范圍內(nèi)都是可以保證原子性的,主要是依賴(lài)特殊的CPU指令。另一種是JDK提供的代碼層面的Lock。
    的頭像 發(fā)表于 06-09 16:13 ?1566次閱讀
    <b class='flag-5'>synchronized</b>的原理與四種用法介紹

    synchronized 的幾種錯(cuò)誤用法

    synchronized 在我們平常工作中也是挺常用的, 對(duì)于擺脫多線(xiàn)程問(wèn)題很有幫助。但是如果synchronized被錯(cuò)誤使用時(shí),可能會(huì)給我們帶來(lái)很多麻煩。 在本文中,我們將討論與同步相關(guān)的一些
    的頭像 發(fā)表于 10-09 10:25 ?1076次閱讀