欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java中synchronized與Lock的詳細(xì)對(duì)比

 更新時(shí)間:2025年07月05日 09:10:01   作者:四川的田先生  
Lock和synchronized都是Java中用于實(shí)現(xiàn)線程同步的機(jī)制,但它們有一些重要的區(qū)別,這篇文章主要介紹了Java中synchronized與Lock的詳細(xì)對(duì)比,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下

前言

在之前的面試中遇到過(guò)這樣一個(gè)問(wèn)題,synchronized和lock的對(duì)比,只回到了4個(gè)區(qū)別特性,記錄一下。

synchronizedLock都是Java中用于實(shí)現(xiàn)線程同步的機(jī)制,但它們?cè)趯?shí)現(xiàn)方式、功能和性能上有顯著差異。以下是兩者的詳細(xì)對(duì)比:

1. 基本特性對(duì)比

特性synchronizedLock (ReentrantLock)
實(shí)現(xiàn)方式Java關(guān)鍵字,JVM層面實(shí)現(xiàn)Java類,API層面實(shí)現(xiàn)
獲取與釋放自動(dòng)獲取和釋放鎖需要手動(dòng)調(diào)用lock()和unlock()
鎖的類型非公平鎖可選擇公平鎖或非公平鎖
可中斷性不可中斷可中斷(lockInterruptibly())
嘗試獲取鎖不支持支持(tryLock())
超時(shí)機(jī)制不支持支持(tryLock(time, unit))
條件變量只能有一個(gè)條件隊(duì)列可創(chuàng)建多個(gè)Condition對(duì)象
性能JDK6后優(yōu)化,性能接近高競(jìng)爭(zhēng)下性能可能更好

2. 詳細(xì)比較

2.1 使用方式

synchronized:

public synchronized void method() {
    // 同步代碼
}

// 或
public void method() {
    synchronized(this) {
        // 同步代碼塊
    }
}

Lock:

private Lock lock = new ReentrantLock();

public void method() {
    lock.lock();
    try {
        // 同步代碼
    } finally {
        lock.unlock();
    }
}

2.2 高級(jí)功能

Lock提供而synchronized不具備的功能:

  • 嘗試非阻塞獲取鎖tryLock()

  • 可中斷的獲取鎖lockInterruptibly()

  • 超時(shí)獲取鎖tryLock(long time, TimeUnit unit)

  • 公平鎖new ReentrantLock(true)

  • 多個(gè)條件變量newCondition()

2.3 性能考慮

  • 在低競(jìng)爭(zhēng)情況下,synchronized性能與Lock相當(dāng)

  • 在高競(jìng)爭(zhēng)情況下,Lock通常表現(xiàn)更好

  • synchronized有優(yōu)化空間(鎖升級(jí):偏向鎖→輕量級(jí)鎖→重量級(jí)鎖)

  • Lock需要手動(dòng)釋放鎖,容易忘記導(dǎo)致死鎖

  • 內(nèi)存占用 synchronized通常更節(jié)省內(nèi)存(特別是無(wú)競(jìng)爭(zhēng)時(shí));Lock需要額外對(duì)象來(lái)維護(hù)狀態(tài)和隊(duì)列

2.4 擴(kuò)展性

  • Lock的等待隊(duì)列實(shí)現(xiàn)更適合大量線程競(jìng)爭(zhēng)

  • synchronized的Monitor在大量線程競(jìng)爭(zhēng)時(shí)可能成為瓶頸

2.5 選擇建議

使用synchronized的情況:

  • 簡(jiǎn)單的同步需求

  • 不需要高級(jí)功能

  • 希望代碼更簡(jiǎn)潔

  • 鎖的獲取和釋放在一個(gè)方法內(nèi)完成

使用Lock的情況:

  • 需要高級(jí)功能(可中斷、超時(shí)、嘗試獲取等)

  • 需要公平鎖

  • 需要多個(gè)條件變量

  • 鎖需要在多個(gè)方法間傳遞和釋放

  • 高競(jìng)爭(zhēng)環(huán)境下對(duì)性能有更高要求

3. 示例對(duì)比

3.1 可中斷鎖示例

使用Lock:

Lock lock = new ReentrantLock();
try {
    lock.lockInterruptibly();
    // 同步代碼
} catch (InterruptedException e) {
    // 處理中斷
} finally {
    lock.unlock();
}

synchronized無(wú)法實(shí)現(xiàn)可中斷鎖

3.2 嘗試獲取鎖示例

使用Lock:

 if (lock.tryLock()) {
    try {
        // 獲取鎖成功
    } finally {
        lock.unlock();
    }
} else {
    // 獲取鎖失敗
}

 synchronized無(wú)法實(shí)現(xiàn)嘗試獲取鎖

4. 總結(jié)

synchronized是Java內(nèi)置的同步機(jī)制,使用簡(jiǎn)單但功能有限;Lock提供了更豐富的功能但需要手動(dòng)管理。在大多數(shù)情況下,synchronized已經(jīng)足夠,只有在需要其不具備的高級(jí)功能時(shí),才應(yīng)考慮使用Lock。

到此這篇關(guān)于Java中synchronized與Lock詳細(xì)對(duì)比的文章就介紹到這了,更多相關(guān)Java synchronized與Lock對(duì)比內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring詳細(xì)講解事務(wù)失效的場(chǎng)景

    Spring詳細(xì)講解事務(wù)失效的場(chǎng)景

    實(shí)際項(xiàng)目開(kāi)發(fā)中,如果涉及到多張表操作時(shí),為了保證業(yè)務(wù)數(shù)據(jù)的一致性,大家一般都會(huì)采用事務(wù)機(jī)制,好多小伙伴可能只是簡(jiǎn)單了解一下,遇到事務(wù)失效的情況,便會(huì)無(wú)從下手,下面這篇文章主要給大家介紹了關(guān)于Spring事務(wù)失效場(chǎng)景的相關(guān)資料,需要的朋友可以參考下
    2022-07-07
  • 使用@Validate分組驗(yàn)證參數(shù)

    使用@Validate分組驗(yàn)證參數(shù)

    SpringFramework的@Validated注解用于方法級(jí)別參數(shù)驗(yàn)證,結(jié)合BeanValidation規(guī)范,支持分組驗(yàn)證,通過(guò)指定驗(yàn)證分組,可以在不同場(chǎng)景下執(zhí)行不同的驗(yàn)證邏輯
    2024-11-11
  • Java 實(shí)戰(zhàn)練習(xí)之網(wǎng)上電商項(xiàng)目的實(shí)現(xiàn)

    Java 實(shí)戰(zhàn)練習(xí)之網(wǎng)上電商項(xiàng)目的實(shí)現(xiàn)

    讀萬(wàn)卷書(shū)不如行萬(wàn)里路,只學(xué)書(shū)上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+vue+Springboot+ssm+mysql+maven+redis實(shí)現(xiàn)一個(gè)網(wǎng)上電商項(xiàng)目,大家可以在過(guò)程中查缺補(bǔ)漏,提升水平
    2021-11-11
  • springboot整合shiro多驗(yàn)證登錄功能的實(shí)現(xiàn)(賬號(hào)密碼登錄和使用手機(jī)驗(yàn)證碼登錄)

    springboot整合shiro多驗(yàn)證登錄功能的實(shí)現(xiàn)(賬號(hào)密碼登錄和使用手機(jī)驗(yàn)證碼登錄)

    這篇文章給大家介紹springboot整合shiro多驗(yàn)證登錄功能的實(shí)現(xiàn)方法,包括賬號(hào)密碼登錄和使用手機(jī)驗(yàn)證碼登錄功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2021-07-07
  • 詳解Spring與Mybatis整合方法(基于IDEA中的Maven整合)

    詳解Spring與Mybatis整合方法(基于IDEA中的Maven整合)

    這篇文章主要介紹了Spring與Mybatis整合方法(基于IDEA中的Maven整合),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-10-10
  • Hibernate管理Session和批量操作分析

    Hibernate管理Session和批量操作分析

    這篇文章主要介紹了Hibernate管理Session和批量操作的技巧,包括Hibernate管理Session、批量處理數(shù)據(jù)等的常用技巧及注意事項(xiàng),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2014-12-12
  • 淺談Spring Data Redis讀不到設(shè)進(jìn)去的值

    淺談Spring Data Redis讀不到設(shè)進(jìn)去的值

    本文主要介紹了Spring Data Redis怎么讀不到我剛才設(shè)進(jìn)去的值,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • 使用Springboot+poi上傳并處理百萬(wàn)級(jí)數(shù)據(jù)EXCEL

    使用Springboot+poi上傳并處理百萬(wàn)級(jí)數(shù)據(jù)EXCEL

    這篇文章主要介紹了使用Springboot+poi上傳并處理百萬(wàn)級(jí)數(shù)據(jù)EXCEL,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • Java使用Jdbc連接Oracle執(zhí)行簡(jiǎn)單查詢操作示例

    Java使用Jdbc連接Oracle執(zhí)行簡(jiǎn)單查詢操作示例

    這篇文章主要介紹了Java使用Jdbc連接Oracle執(zhí)行簡(jiǎn)單查詢操作,結(jié)合實(shí)例形式詳細(xì)分析了java基于jdbc實(shí)現(xiàn)Oracle數(shù)據(jù)庫(kù)的連接與查詢相關(guān)操作技巧,需要的朋友可以參考下
    2019-09-09
  • Java 日期轉(zhuǎn)換詳解及實(shí)例代碼

    Java 日期轉(zhuǎn)換詳解及實(shí)例代碼

    這篇文章主要介紹了Java 日期轉(zhuǎn)換詳解及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下
    2016-11-11

最新評(píng)論