最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java 中常見的鎖與最佳實踐

 更新時間:2026年03月11日 08:57:34   作者:數(shù)據(jù)  
本文介紹了Java中常見的鎖,包括語法/實現(xiàn)層面的synchronized關(guān)鍵字、Lock接口及其實現(xiàn)類,討論了鎖的特性、常見誤區(qū)與最佳實踐,感興趣的朋友跟隨小編一起看看吧

Java 中的鎖可以從多個維度來劃分,常見的鎖包括:

  • 語法/實現(xiàn)層面:synchronized 關(guān)鍵字(內(nèi)置鎖)、Lock 接口及其實現(xiàn)類(如 ReentrantLock、ReentrantReadWriteLock、StampedLock)。
  • 特性層面:可重入鎖、公平鎖/非公平鎖、讀寫鎖、樂觀鎖/悲觀鎖、自旋鎖、分段鎖等。
  • 并發(fā)工具包中的輔助鎖:Semaphore(信號量,可看作共享鎖)、CountDownLatchCyclicBarrier 等雖不是嚴格意義上的鎖,但也用于控制線程協(xié)作。

下面我們從最常用的幾個維度展開聊聊。

1. 從語法和 API 層面看

synchronized(內(nèi)置鎖)

  • 使用方式:修飾實例方法、靜態(tài)方法或代碼塊。
  • 原理:基于對象頭的 Mark Word 和 monitor 對象實現(xiàn)。JDK 1.6 以后引入了偏向鎖、輕量級鎖、重量級鎖的升級過程,以優(yōu)化性能。
  • 特點:使用簡單,自動釋放鎖(異?;蛘M顺鰰r),可重入。但無法中斷等待鎖的線程,也無法設(shè)置超時。
  • 最佳實踐:適用于鎖的競爭不激烈、代碼簡單的情況。比如單例模式的同步方法、簡單的線程安全計數(shù)器。

Lock接口(顯式鎖)

最核心的實現(xiàn)是 ReentrantLock,它提供了比 synchronized 更靈活的鎖操作。

  • ReentrantLock
  • 示例:
ReentrantLock lock = new ReentrantLock(true); // 公平鎖
lock.lock();
try {
    // 臨界區(qū)
} finally {
    lock.unlock(); // 必須手動釋放
}
  • 可重入:同一個線程可以多次獲得同一把鎖。
  • 公平/非公平:構(gòu)造函數(shù)可指定是否公平。公平鎖按線程等待順序獲取鎖,非公平鎖允許插隊(默認非公平,吞吐量更高)。
  • 可中斷:lockInterruptibly() 允許在等待鎖時響應(yīng)中斷。
  • 超時獲?。?code>tryLock(long time, TimeUnit unit) 可以指定等待時間。
  • 配合 Condition:可實現(xiàn)多個等待/通知條件,比 wait/notify 更精細。
  • ReentrantReadWriteLock
  • 維護一對鎖:讀鎖(共享)和寫鎖(排他)。讀多寫少場景下可大幅提升并發(fā)度。
  • 讀鎖可以被多個讀線程同時持有,但寫鎖獨占,且讀寫互斥。
  • 可能出現(xiàn)“寫?zhàn)囸I”問題,但在非公平模式下,寫鎖優(yōu)先級通常較高。
  • StampedLock(JDK 8 引入)
  • 進一步優(yōu)化讀多寫少場景,支持三種模式:寫鎖、讀鎖、樂觀讀。
  • 樂觀讀:不加鎖,直接讀取數(shù)據(jù),之后通過 validate 檢查是否有寫操作發(fā)生。若無效再升級為讀鎖重讀。
  • 特點:不可重入,不支持條件變量,適合讀線程遠多于寫線程的場景。

2. 從鎖的特性層面看

  • 悲觀鎖 vs 樂觀鎖
    • 悲觀鎖:假設(shè)并發(fā)沖突概率高,每次操作都加鎖(如 synchronized、ReentrantLock)。適合寫多場景。
    • 樂觀鎖:假設(shè)沖突少,先操作,提交時用 CAS(Compare And Swap)檢測沖突,沖突則重試。如 java.util.concurrent.atomic 包下的原子類。適合讀多寫少、沖突概率低的場景。
  • 可重入鎖
    • 同一線程可以重復(fù)獲取同一把鎖,避免死鎖。Java 中的 synchronized 和 ReentrantLock 都是可重入的。
  • 公平鎖 vs 非公平鎖
    • 公平鎖按線程請求鎖的順序獲取鎖,避免饑餓,但吞吐量較低;非公平鎖允許插隊,吞吐量更高,但可能導(dǎo)致某些線程長時間得不到鎖。
  • 自旋鎖
    • 線程獲取鎖失敗時不立即掛起,而是循環(huán)嘗試(自旋),減少線程上下文切換的開銷。適合鎖持有時間短的場景。JDK 內(nèi)部大量使用了自旋鎖(如 ConcurrentLinkedQueue 的入隊操作)。Java 中也提供了 AbstractQueuedSynchronizer(AQS)對自旋和阻塞的支持。
  • 分段鎖
    • ConcurrentHashMap 在 JDK 1.7 中的實現(xiàn),將數(shù)據(jù)分段,每段一把鎖,降低鎖粒度,提升并發(fā)度。JDK 1.8 改用 CAS + synchronized 對每個桶(數(shù)組元素)加鎖,相當于進一步細化。

3. 并發(fā)工具包中的 “鎖” 變體

  • Semaphore:計數(shù)信號量,可以控制同時訪問資源的線程數(shù)量(共享鎖)。比如限流場景。
  • CountDownLatch:讓一個或多個線程等待,直到一組操作完成。
  • CyclicBarrier:讓一組線程互相等待,到達某個屏障點后再同時執(zhí)行。

雖然這些不是傳統(tǒng)意義上的鎖,但它們也常被用來解決線程協(xié)作問題,面試時可以作為補充提及。

常見誤區(qū)與最佳實踐

  • 誤區(qū)一:認為 synchronized 性能總比 ReentrantLock 差。實際上 JDK 1.6 以后 synchronized 經(jīng)過優(yōu)化,性能與 ReentrantLock 差距不大,甚至在低競爭時更好。選擇時應(yīng)更關(guān)注功能需求。
  • 誤區(qū)二:濫用讀寫鎖。如果讀操作很短,或者寫操作頻繁,讀寫鎖可能不如普通互斥鎖,因為維護讀鎖和寫鎖本身也有開銷。
  • 誤區(qū)三:忘記在 finally 中釋放顯式鎖。這是新手最容易犯的錯誤,可能導(dǎo)致死鎖。
  • 最佳實踐:
    • 優(yōu)先使用 synchronized,簡潔安全;需要高級功能(如可中斷、超時、公平性、多 Condition)時才選用 ReentrantLock。
    • 讀多寫少且數(shù)據(jù)一致性要求不那么極致時,可考慮 StampedLock 的樂觀讀模式,或使用 CopyOnWrite 容器。
    • 對于簡單的原子操作,優(yōu)先使用 Atomic 系列類(樂觀鎖思想),避免鎖開銷。
    • 了解 JVM 的鎖優(yōu)化(如偏向鎖、輕量級鎖),有助于調(diào)優(yōu)高并發(fā)應(yīng)用。

到此這篇關(guān)于Java 中常見的鎖有哪些?的文章就介紹到這了,更多相關(guān)java常見鎖內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java網(wǎng)絡(luò)通信中URL與HTTP編程技術(shù)詳解

    Java網(wǎng)絡(luò)通信中URL與HTTP編程技術(shù)詳解

    要想實現(xiàn)網(wǎng)絡(luò)編程,除了可以使用Socket之外,我們還可以利用URL編程或HTTP編程技術(shù),所以今天這篇文章,就給大家介紹一下URL編程和HTTP編程技術(shù),看看這兩種技術(shù)有什么特點,文中有詳細的代碼講解,需要的朋友可以參考下
    2023-11-11
  • Java中接收鍵盤輸入的三種方法

    Java中接收鍵盤輸入的三種方法

    這篇文章主要介紹了Java中接收鍵盤輸入的三種方法,本文給出3個方法實現(xiàn)通過讀取控制臺的輸入與用戶實現(xiàn)交互,需要的朋友可以參考下
    2015-06-06
  • idea導(dǎo)入gradle項目時遇到的坑及解決

    idea導(dǎo)入gradle項目時遇到的坑及解決

    這篇文章主要介紹了idea導(dǎo)入gradle項目時遇到的坑及解決,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • 詳解基于JWT的springboot權(quán)限驗證技術(shù)實現(xiàn)

    詳解基于JWT的springboot權(quán)限驗證技術(shù)實現(xiàn)

    這篇文章主要介紹了詳解基于JWT的springboot權(quán)限驗證技術(shù)實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • Java多線程批量數(shù)據(jù)導(dǎo)入的方法詳解

    Java多線程批量數(shù)據(jù)導(dǎo)入的方法詳解

    這篇文章主要介紹了Java多線程批量數(shù)據(jù)導(dǎo)入的方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,下面小編和大家來一起學(xué)習(xí)下吧
    2019-06-06
  • spring data jpa開啟批量插入、批量更新的問題解析

    spring data jpa開啟批量插入、批量更新的問題解析

    這篇文章主要介紹了spring data jpa開啟批量插入、批量更新問題,本文通過圖文實例相結(jié)合給大家介紹的非常詳細,需要的朋友可以參考下
    2021-07-07
  • SpringBoot使用自定義注解實現(xiàn)權(quán)限攔截的示例

    SpringBoot使用自定義注解實現(xiàn)權(quán)限攔截的示例

    本篇文章主要介紹了SpringBoot使用自定義注解實現(xiàn)權(quán)限攔截的示例,具有一定的參考價值,有興趣的可以了解一下
    2017-09-09
  • 如何在Spring data中使用r2dbc詳解

    如何在Spring data中使用r2dbc詳解

    這篇文章主要給大家介紹了關(guān)于如何在Spring data中使用r2dbc的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • RocketMQ的消費者類型與最佳實踐詳解

    RocketMQ的消費者類型與最佳實踐詳解

    這篇文章主要介紹了RocketMQ的消費者類型與最佳實踐詳解,在?RocketMQ?5.0?中,更加強調(diào)了客戶端類型的概念,尤其是消費者類型,為了滿足多樣的?RocketMQ?中一共有三種不同的消費者類型,分別是?PushConsumer、SimpleConsumer?和?PullConsumer,需要的朋友可以參考下
    2023-10-10
  • SpringSecurity 默認表單登錄頁展示流程源碼

    SpringSecurity 默認表單登錄頁展示流程源碼

    本篇主要講解 SpringSecurity提供的默認表單登錄頁 它是如何展示流程,本文圖文并茂給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友參考下吧
    2020-01-01

最新評論

含山县| 醴陵市| 平安县| 桐城市| 乌海市| 平乐县| 屏边| 屯昌县| 江都市| 上林县| 六枝特区| 嘉善县| 修武县| 梓潼县| 新竹市| 湟源县| 彭州市| 内乡县| 南康市| 四平市| 射阳县| 淮北市| 昌宁县| 武鸣县| 来安县| 时尚| 贞丰县| 来凤县| 望奎县| 冀州市| 武功县| 望江县| 宜章县| 新昌县| 柘荣县| 杂多县| 政和县| 五大连池市| 滨州市| 北川| 定南县|