成人免费观看网欧美片-成人免费观看视频-成人免费观看男女羞羞视频-成人免费观看的视频黄页-成人免费高清视频-成人免费福利片在线观看

千鋒教育-做有情懷、有良心、有品質(zhì)的職業(yè)教育機構(gòu)

手機站
千鋒教育

千鋒學習站 | 隨時隨地免費學

千鋒教育

掃一掃進入千鋒手機站

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

關(guān)注千鋒學習站小程序
隨時隨地免費學習課程

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

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

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

一、synchronized鎖的基本原理

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

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

二、synchronized鎖的升級

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

1、偏向鎖(Biased Locking)

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

2、輕量級鎖(Lightweight Locking)

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

3、重量級鎖(Heavyweight Locking)

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

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

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

1、偏向鎖

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

2、輕量級鎖

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

3、重量級鎖

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

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

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

聲明:本站稿件版權(quán)均屬千鋒教育所有,未經(jīng)許可不得擅自轉(zhuǎn)載。
10年以上業(yè)內(nèi)強師集結(jié),手把手帶你蛻變精英
請您保持通訊暢通,專屬學習老師24小時內(nèi)將與您1V1溝通
免費領(lǐng)取
今日已有369人領(lǐng)取成功
劉同學 138****2860 剛剛成功領(lǐng)取
王同學 131****2015 剛剛成功領(lǐng)取
張同學 133****4652 剛剛成功領(lǐng)取
李同學 135****8607 剛剛成功領(lǐng)取
楊同學 132****5667 剛剛成功領(lǐng)取
岳同學 134****6652 剛剛成功領(lǐng)取
梁同學 157****2950 剛剛成功領(lǐng)取
劉同學 189****1015 剛剛成功領(lǐng)取
張同學 155****4678 剛剛成功領(lǐng)取
鄒同學 139****2907 剛剛成功領(lǐng)取
董同學 138****2867 剛剛成功領(lǐng)取
周同學 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)之間,這是因為它在以下...詳情>>

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

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

2023-10-13 09:05:04
Kettle連接MySQL為什么會報錯?

一、Kettle連接MySQL會報錯的原因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é)作。當一個線程調(diào)用某個對象的wait()方法時,它會釋放該對象的鎖,并進入等...詳情>>

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

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

2023-10-13 08:42:01
快速通道