久久精品国产亚洲高清|精品日韩中文乱码在线|亚洲va中文字幕无码久|伊人久久综合狼伊人久久|亚洲不卡av不卡一区二区|精品久久久久久久蜜臀AV|国产精品19久久久久久不卡|国产男女猛烈视频在线观看麻豆

    1. <style id="76ofp"></style>

      <style id="76ofp"></style>
      <rt id="76ofp"></rt>
      <form id="76ofp"><optgroup id="76ofp"></optgroup></form>
      1. 千鋒教育-做有情懷、有良心、有品質(zhì)的職業(yè)教育機(jī)構(gòu)

        手機(jī)站
        千鋒教育

        千鋒學(xué)習(xí)站 | 隨時隨地免費(fèi)學(xué)

        千鋒教育

        掃一掃進(jìn)入千鋒手機(jī)站

        領(lǐng)取全套視頻
        千鋒教育

        關(guān)注千鋒學(xué)習(xí)站小程序
        隨時隨地免費(fèi)學(xué)習(xí)課程

        當(dāng)前位置:首頁  >  技術(shù)干貨  > synchronized鎖的升級原理是什么,以及各個鎖的狀態(tài)對比?

        synchronized鎖的升級原理是什么,以及各個鎖的狀態(tài)對比?

        來源:千鋒教育
        發(fā)布人:xqq
        時間: 2023-10-13 08:14:11 1697156051

        一、synchronized鎖的基本原理

        synchronized是Java中用于實(shí)現(xiàn)線程安全的關(guān)鍵字,它可以應(yīng)用于方法或代碼塊。當(dāng)一個線程進(jìn)入synchronized代碼塊時,它將獲得一個鎖,其他線程在嘗試進(jìn)入同步代碼塊時會被阻塞,直到持有鎖的線程釋放鎖。

        synchronized鎖的基本原理是基于對象的監(jiān)視器(monitor)。每個Java對象都有一個與之關(guān)聯(lián)的監(jiān)視器,這個監(jiān)視器可以被一個線程持有。當(dāng)一個線程獲取到對象的監(jiān)視器時,它就可以執(zhí)行同步代碼塊,其他線程則需要等待。

        二、synchronized鎖的升級

        盡管synchronized鎖是簡單易用的,但在高并發(fā)場景下性能可能不盡如人意。為了提高并發(fā)性能,Java引入了一些鎖的升級機(jī)制,具體如下:

        1、偏向鎖(Biased Locking)

        偏向鎖是JDK 6中引入的一種優(yōu)化機(jī)制。它的設(shè)計(jì)初衷是針對沒有競爭的場景,假設(shè)在多數(shù)情況下,鎖總是由同一線程多次獲得的。在偏向鎖狀態(tài)下,當(dāng)一個線程獲取到鎖后,會在對象頭中記錄下自己的線程ID。這樣,下次該線程再次獲取鎖時,無需進(jìn)行同步操作,可以直接進(jìn)入臨界區(qū)。

        2、輕量級鎖(Lightweight Locking)

        輕量級鎖是JDK 6中對synchronized鎖的升級改進(jìn)。它的目標(biāo)是在多個線程交替執(zhí)行同步塊的情況下,減少傳統(tǒng)的重量級鎖的開銷。輕量級鎖的實(shí)現(xiàn)方式是通過CAS(Compare and Swap)操作來實(shí)現(xiàn),將對象頭中的一部分空間作為鎖記錄。當(dāng)多個線程競爭同一鎖時,會嘗試使用CAS操作來獲取鎖,成功則進(jìn)入臨界區(qū),失敗則升級為重量級鎖。

        3、重量級鎖(Heavyweight Locking)

        重量級鎖是synchronized鎖的默認(rèn)狀態(tài),也是最常見的狀態(tài)。當(dāng)多個線程競爭同一鎖時,會進(jìn)入重量級鎖狀態(tài)。在重量級鎖狀態(tài)下,競爭失敗的線程會進(jìn)入阻塞狀態(tài),被放入鎖的等待隊(duì)列中。只有持有鎖的線程釋放鎖后,等待隊(duì)列中的線程才有機(jī)會獲取鎖進(jìn)入臨界區(qū)。

        三、各個鎖的狀態(tài)對比

        下面對偏向鎖、輕量級鎖和重量級鎖進(jìn)行簡要對比,以便更好地理解它們之間的差異。

        1、偏向鎖

        適用場景:適用于多數(shù)情況下鎖總是由同一線程多次獲得的場景。獲取鎖的代價:獲取偏向鎖的代價非常低,幾乎沒有額外開銷。競爭情況:當(dāng)其他線程嘗試競爭偏向鎖時,偏向鎖會自動升級為輕量級鎖。

        2、輕量級鎖

        適用場景:適用于多個線程交替執(zhí)行同步塊的情況,競爭不激烈的場景。獲取鎖的代價:獲取輕量級鎖的代價相對較低,需要進(jìn)行CAS操作。競爭情況:當(dāng)競爭激烈或者CAS操作失敗時,輕量級鎖會自動升級為重量級鎖。

        3、重量級鎖

        適用場景:適用于競爭激烈的場景,多個線程頻繁爭奪同一個鎖的情況。獲取鎖的代價:獲取重量級鎖的代價相對較高,需要進(jìn)行線程阻塞和喚醒操作。競爭情況:當(dāng)持有鎖的線程釋放鎖后,等待隊(duì)列中的線程按照FIFO順序競爭鎖的獲取。

        需要注意的是,鎖的升級過程是自動進(jìn)行的,開發(fā)者無需手動干預(yù)。JVM會根據(jù)鎖的競爭情況自動切換鎖的狀態(tài),以平衡性能和線程公平性。

        在實(shí)際開發(fā)中,選擇合適的鎖取決于具體的應(yīng)用場景和線程競爭情況。如果線程之間的競爭非常激烈,可以考慮使用其他更高級的鎖機(jī)制,如并發(fā)包中提供的ReentrantLock、ReadWriteLock等,它們提供了更細(xì)粒度的控制和更高的并發(fā)性能。

        聲明:本站稿件版權(quán)均屬千鋒教育所有,未經(jīng)許可不得擅自轉(zhuǎn)載。
        10年以上業(yè)內(nèi)強(qiáng)師集結(jié),手把手帶你蛻變精英
        請您保持通訊暢通,專屬學(xué)習(xí)老師24小時內(nèi)將與您1V1溝通
        免費(fèi)領(lǐng)取
        今日已有369人領(lǐng)取成功
        劉同學(xué) 138****2860 剛剛成功領(lǐng)取
        王同學(xué) 131****2015 剛剛成功領(lǐng)取
        張同學(xué) 133****4652 剛剛成功領(lǐng)取
        李同學(xué) 135****8607 剛剛成功領(lǐng)取
        楊同學(xué) 132****5667 剛剛成功領(lǐng)取
        岳同學(xué) 134****6652 剛剛成功領(lǐng)取
        梁同學(xué) 157****2950 剛剛成功領(lǐng)取
        劉同學(xué) 189****1015 剛剛成功領(lǐng)取
        張同學(xué) 155****4678 剛剛成功領(lǐng)取
        鄒同學(xué) 139****2907 剛剛成功領(lǐng)取
        董同學(xué) 138****2867 剛剛成功領(lǐng)取
        周同學(xué) 136****3602 剛剛成功領(lǐng)取
        相關(guān)推薦HOT
        怎么理解Mongodb是介于關(guān)系型和非關(guān)系型的數(shù)據(jù)庫?

        一、怎么理解Mongodb是介于關(guān)系型和非關(guān)系型的數(shù)據(jù)庫MongoDB被稱為介于關(guān)系型數(shù)據(jù)庫(RDBMS)和非關(guān)系型數(shù)據(jù)庫(NoSQL)之間,這是因?yàn)樗谝韵?..詳情>>

        2023-10-13 09:55:50
        DBeaver怎么保持?jǐn)?shù)據(jù)庫連接?

        一、DBeaver保持?jǐn)?shù)據(jù)庫連接的方法1、連接到數(shù)據(jù)庫打開DBeaver并選擇連接到您的目標(biāo)數(shù)據(jù)庫。選擇適當(dāng)?shù)臄?shù)據(jù)庫類型,輸入必要的連接信息,如主機(jī)...詳情>>

        2023-10-13 09:05:04
        Kettle連接MySQL為什么會報(bào)錯?

        一、Kettle連接MySQL會報(bào)錯的原因1、驅(qū)動程序缺失Kettle需要使用MySQL的JDBC驅(qū)動程序來連接MySQL數(shù)據(jù)庫。如果沒有正確配置或提供JDBC驅(qū)動程序,...詳情>>

        2023-10-13 08:53:41
        wait()、sleep()、join()和yield()區(qū)別是什么?

        一、wait()wait()方法是Object類中的方法,主要用于線程間的同步和協(xié)作。當(dāng)一個線程調(diào)用某個對象的wait()方法時,它會釋放該對象的鎖,并進(jìn)入等...詳情>>

        2023-10-13 08:45:29
        什么是Caché數(shù)據(jù)庫?

        一、對象訪問通過對象訪問,開發(fā)人員可以使用面向?qū)ο蟮木幊陶Z言(如Java、C#等)直接操作數(shù)據(jù)庫中的對象。這種方式提供了更加直觀和便捷的數(shù)據(jù)...詳情>>

        2023-10-13 08:42:01
        快速通道
        长武县| 奉贤区| 郴州市| 华坪县| 化隆| 长海县| 承德县| 北川| 舟曲县| 金山区| 名山县| 剑河县| 翼城县| 新蔡县| 隆子县| 敦化市| 项城市| 黎川县| 铜鼓县| 芦溪县| 兴隆县| 嘉义市| 永济市| 阜宁县| 广德县| 济宁市| 梧州市| 湟源县| 黄浦区| 鄯善县| 鸡泽县| 偃师市| 顺义区| 大足县| 昌邑市| 新竹县| 乐平市| 吉木乃县| 松潘县| 石泉县| 邹城市|