日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

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

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

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

synchronized的鎖膨脹

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

掃碼添加小助手

加入工程師交流群

初識(shí)

synchronized 可以加在方法和類上面,作用于類和對(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)存開始講起,對(duì)象在被實(shí)例化后,是存放在堆內(nèi)存中的,它由 3 部分組成:

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

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

圖片

  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無鎖
線程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(類型指針):對(duì)象指向類的元數(shù)據(jù)的指針,虛擬機(jī)通過這個(gè)指針來確定對(duì)象是哪一個(gè)類的實(shí)例。

鎖膨脹

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

偏向鎖

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

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

圖片

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

輕量級(jí)鎖

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

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

圖片

重量級(jí)鎖

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

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

圖片

ObjectMonitor 主要的字段有:

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

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

圖片

總結(jié)

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

    關(guān)注

    9

    文章

    3238

    瀏覽量

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

    關(guān)注

    30

    文章

    4977

    瀏覽量

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

    關(guān)注

    0

    文章

    161

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

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

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

    電子膨脹閥的介紹

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

    電池膨脹原因分析

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

    Synchronized multi-spark modul

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

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

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

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

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

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

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

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

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

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

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

    一文了解 Synchronized編程(源代碼)

    每個(gè)類都有一個(gè)類,類的每個(gè)對(duì)象也有一個(gè)內(nèi)置,它們是互不干擾的,也就是說一個(gè)線程可以同時(shí)獲得類和該類實(shí)例化對(duì)象的內(nèi)置,當(dāng)線程訪問非synchronzied修飾的方法時(shí),并不需要獲
    發(fā)表于 08-06 15:50 ?768次閱讀

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

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

    synchronized知識(shí)合集1

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

    synchronized的原理與四種用法介紹

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

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

    synchronized 在我們平常工作中也是挺常用的, 對(duì)于擺脫多線程問題很有幫助。但是如果synchronized被錯(cuò)誤使用時(shí),可能會(huì)給我們帶來很多麻煩。 在本文中,我們將討論與同步相關(guān)的一些
    的頭像 發(fā)表于 10-09 10:25 ?1608次閱讀
    葫芦岛市| 夹江县| 马山县| 武功县| 九江县| 新沂市| 类乌齐县| 沙雅县| 无为县| 沁源县| 凤城市| 宁夏| 延长县| 仙桃市| 德清县| 台南市| 永定县| 乌拉特中旗| 盱眙县| 大埔县| 广元市| 离岛区| 夏河县| 双柏县| 柘城县| 盘锦市| 清涧县| 如皋市| 日土县| 松江区| 彭州市| 玛曲县| 时尚| 开平市| 平顶山市| 侯马市| 揭西县| 鄂尔多斯市| 闽清县| 荆门市| 巴青县|