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

Java中synchronized關(guān)鍵字鎖的力度與位置示例詳解

 更新時(shí)間:2026年01月11日 11:54:20   作者:北漂老男人  
synchronized是Java中最核心的線(xiàn)程同步機(jī)制,用于解決多線(xiàn)程環(huán)境下的數(shù)據(jù)競(jìng)爭(zhēng)和可見(jiàn)性問(wèn)題,這篇文章主要介紹了Java中synchronized關(guān)鍵字鎖的力度與位置的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下

一、引言

synchronized是Java并發(fā)編程中最常用的同步工具。它通過(guò)“對(duì)象鎖”來(lái)保證臨界區(qū)代碼的線(xiàn)程安全。不同位置的synchronized鎖定范圍(鎖的力度)不同,直接影響程序的并發(fā)性能和正確性。本文將圍繞synchronized的不同使用位置,深入剖析其設(shè)計(jì)思想、技巧、優(yōu)缺點(diǎn)、源碼實(shí)現(xiàn),并結(jié)合實(shí)際業(yè)務(wù)場(chǎng)景,給出調(diào)試與優(yōu)化建議。同時(shí),探討與其他技術(shù)棧的集成與高階應(yīng)用。

二、主流程環(huán)節(jié)與設(shè)計(jì)思想

1. 方法級(jí)鎖(對(duì)象鎖/類(lèi)鎖)

設(shè)計(jì)思想
鎖定整個(gè)方法,保證同一對(duì)象的該方法同時(shí)只被一個(gè)線(xiàn)程執(zhí)行。

核心代碼

public synchronized void instanceMethod() {
    // 關(guān)鍵業(yè)務(wù)邏輯
}
public static synchronized void staticMethod() {
    // 關(guān)鍵業(yè)務(wù)邏輯
}

流程圖

優(yōu)缺點(diǎn)

優(yōu)點(diǎn)缺點(diǎn)
簡(jiǎn)單易用,鎖粒度大,易于保證安全并發(fā)度低,可能導(dǎo)致性能瓶頸

2. 代碼塊級(jí)鎖(細(xì)粒度鎖)

設(shè)計(jì)思想

只鎖定臨界區(qū),提高并發(fā)性能,縮小鎖定范圍。

核心代碼

public void blockLock(Object lockObj) {
    // 非關(guān)鍵業(yè)務(wù)邏輯
    synchronized (lockObj) {
        // 關(guān)鍵業(yè)務(wù)邏輯
    }
    // 非關(guān)鍵業(yè)務(wù)邏輯
}

流程圖

優(yōu)缺點(diǎn)

優(yōu)點(diǎn)缺點(diǎn)
并發(fā)度高,性能好編碼復(fù)雜,易出錯(cuò),鎖對(duì)象選擇需謹(jǐn)慎

3. 鎖對(duì)象選擇與鎖力度

  • this:鎖當(dāng)前實(shí)例,影響所有實(shí)例方法。
  • 類(lèi)對(duì)象Class:鎖類(lèi),影響所有靜態(tài)方法。
  • 自定義鎖對(duì)象:可以精細(xì)化控制鎖的范圍,適用于部分資源共享。

核心代碼

private final Object customLock = new Object();

public void customLockMethod() {
    synchronized (customLock) {
        // 關(guān)鍵業(yè)務(wù)邏輯
    }
}

三、源碼解析與速記口訣

Java synchronized底層原理

synchronized的實(shí)現(xiàn)依賴(lài)于JVM的監(jiān)視器鎖(Monitor),對(duì)應(yīng)字節(jié)碼中的monitorentermonitorexit指令。

源碼分析(偽代碼注釋?zhuān)?/p>

public synchronized void example() {
    // JVM會(huì)自動(dòng)在方法入口處加 monitorenter
    // 臨界區(qū)代碼
    // JVM會(huì)自動(dòng)在方法出口處加 monitorexit
}

逐行注釋

  1. 方法簽名加synchronized,JVM自動(dòng)加鎖,無(wú)需手動(dòng)。
  2. 進(jìn)入方法即持有對(duì)象鎖,其他線(xiàn)程需等待。
  3. 方法退出自動(dòng)釋放鎖。

速記口訣
“方法加鎖,入口即鎖,出口即放;代碼塊鎖,對(duì)象自選,范圍自控。”

四、實(shí)際業(yè)務(wù)場(chǎng)景舉例

場(chǎng)景1:銀行賬戶(hù)轉(zhuǎn)賬

public class Account {
    private int balance;

    public synchronized void transfer(Account target, int amount) {
        if (this.balance >= amount) {
            this.balance -= amount;
            target.balance += amount;
        }
    }
}

這里鎖定的是單個(gè)Account對(duì)象,避免并發(fā)轉(zhuǎn)賬導(dǎo)致數(shù)據(jù)不一致。

優(yōu)化技巧

  • 用代碼塊鎖定兩個(gè)Account對(duì)象,避免死鎖。
  • 使用自定義鎖對(duì)象數(shù)組,按賬戶(hù)ID哈希分段鎖,提升并發(fā)。

五、調(diào)試與優(yōu)化技巧

  • 鎖對(duì)象選擇:鎖對(duì)象越細(xì),性能越好,但越難保證安全。
  • 死鎖調(diào)試:通過(guò)jstack分析線(xiàn)程堆棧,定位死鎖點(diǎn)。
  • 鎖競(jìng)爭(zhēng)優(yōu)化:減少鎖范圍、使用并發(fā)容器、分段鎖等技術(shù)。

六、與其他技術(shù)棧集成方案

  • JUC包:如ReentrantLock、ReadWriteLock等,靈活控制鎖粒度和公平性。
  • Spring事務(wù):可通過(guò)synchronized與Spring的事務(wù)管理結(jié)合,保證數(shù)據(jù)一致性。
  • 分布式鎖:如Redis、ZooKeeper實(shí)現(xiàn)跨進(jìn)程鎖,解決多JVM同步問(wèn)題。

七、底層實(shí)現(xiàn)、高級(jí)算法與架構(gòu)演進(jìn)

1. JVM Monitor鎖機(jī)制

  • 偏向鎖、輕量級(jí)鎖重量級(jí)鎖:JVM根據(jù)競(jìng)爭(zhēng)情況自動(dòng)升級(jí)鎖類(lèi)型。
  • 鎖消除、鎖粗化:JIT編譯器優(yōu)化,減少無(wú)意義鎖操作。
  • CAS算法ReentrantLock等并發(fā)包底層采用無(wú)鎖CAS,提高性能。

2. 架構(gòu)演進(jìn)

  • 早期:粗粒度同步,易死鎖,性能低。
  • 后期:細(xì)粒度鎖、分段鎖、鎖分離,提升并發(fā)性能。
  • 分布式:引入分布式鎖,支持橫向擴(kuò)展。

八、權(quán)威資料與參考文獻(xiàn)

  1. Java官方文檔 - synchronized
  2. JUC包源碼分析

九、全文總結(jié)與系統(tǒng)性認(rèn)知

synchronized的鎖定位置決定了鎖的力度和并發(fā)性能。方法級(jí)鎖適合簡(jiǎn)單場(chǎng)景,代碼塊鎖適合性能敏感業(yè)務(wù)。鎖對(duì)象選擇決定了同步范圍,需結(jié)合實(shí)際業(yè)務(wù)合理設(shè)計(jì)。底層實(shí)現(xiàn)依賴(lài)JVM Monitor鎖,現(xiàn)代架構(gòu)通過(guò)鎖優(yōu)化、分段鎖、CAS等技術(shù)提升并發(fā)。與JUC包、Spring、分布式鎖等技術(shù)棧集成,可實(shí)現(xiàn)更復(fù)雜的并發(fā)控制。

知其然更知其所以然

  • 明確鎖定范圍,理解鎖的底層原理。
  • 合理選擇鎖對(duì)象,提升并發(fā)性能。
  • 掌握調(diào)試與優(yōu)化技巧,避免死鎖與性能瓶頸。
  • 學(xué)會(huì)與其他技術(shù)棧集成,構(gòu)建高性能并發(fā)系統(tǒng)。

附:速查表

位置鎖對(duì)象并發(fā)度適用場(chǎng)景
方法級(jí)鎖this/Class簡(jiǎn)單同步,易維護(hù)
代碼塊鎖自定義對(duì)象性能敏感,復(fù)雜同步
JUC鎖Lock對(duì)象更高公平性、可重入需求
分布式鎖Redis/ZK等跨JVM分布式系統(tǒng)

希望本文能幫助你全面理解synchronized鎖的力度與位置選擇,提升并發(fā)編程能力。

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

相關(guān)文章

  • 如何將默認(rèn)的maven倉(cāng)庫(kù)改為阿里的maven倉(cāng)庫(kù)

    如何將默認(rèn)的maven倉(cāng)庫(kù)改為阿里的maven倉(cāng)庫(kù)

    這篇文章主要介紹了如何將默認(rèn)的maven倉(cāng)庫(kù)改為阿里的maven倉(cāng)庫(kù),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-12-12
  • Java實(shí)現(xiàn)圖片拼接

    Java實(shí)現(xiàn)圖片拼接

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)圖片拼接的相關(guān)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • Java?Socket編程從零到實(shí)戰(zhàn)詳解(完整實(shí)戰(zhàn)案例)

    Java?Socket編程從零到實(shí)戰(zhàn)詳解(完整實(shí)戰(zhàn)案例)

    這篇文章主要介紹了Java?Socket編程從零到實(shí)戰(zhàn)詳解,本文給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧
    2025-04-04
  • 使用dom4j解析xml文件問(wèn)題

    使用dom4j解析xml文件問(wèn)題

    這篇文章主要介紹了使用dom4j解析xml文件問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • SpringBoot中5種動(dòng)態(tài)代理的實(shí)現(xiàn)方案

    SpringBoot中5種動(dòng)態(tài)代理的實(shí)現(xiàn)方案

    在SpringBoot應(yīng)用中,動(dòng)態(tài)代理被廣泛用于實(shí)現(xiàn)事務(wù)管理、緩存、安全控制、日志記錄等橫切關(guān)注點(diǎn),下面小編為大家介紹一下SpringBoot中5種動(dòng)態(tài)代理的實(shí)現(xiàn)方案吧
    2025-04-04
  • Spring中@Controller與@RestController核心解析實(shí)戰(zhàn)指南

    Spring中@Controller與@RestController核心解析實(shí)戰(zhàn)指南

    本文系統(tǒng)解析了Spring MVC中@Controller、@RestController和@RequestMapping的核心功能與最佳實(shí)踐,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2025-11-11
  • Java 生成隨機(jī)驗(yàn)證碼圖片的示例

    Java 生成隨機(jī)驗(yàn)證碼圖片的示例

    這篇文章主要介紹了Java 生成隨機(jī)驗(yàn)證碼圖片的示例,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2020-10-10
  • IDEA JetBrains Mono字體介紹和安裝教程(詳解)

    IDEA JetBrains Mono字體介紹和安裝教程(詳解)

    這篇文章主要介紹了IDEA JetBrains Mono字體介紹和安裝教程,本給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-03-03
  • SpringBoot整合mybatis-plus快速入門(mén)超詳細(xì)教程

    SpringBoot整合mybatis-plus快速入門(mén)超詳細(xì)教程

    mybatis-plus 是一個(gè) Mybatis 的增強(qiáng)工具,在 Mybatis 的基礎(chǔ)上只做增強(qiáng)不做改變,為簡(jiǎn)化開(kāi)發(fā)、提高效率而生,本文給大家分享SpringBoot整合mybatis-plus快速入門(mén)超詳細(xì)教程,一起看看吧
    2021-09-09
  • Java中Map.getOrDefault()方法舉例詳解

    Java中Map.getOrDefault()方法舉例詳解

    這篇文章主要介紹了Java?8中Map接口的getOrDefault()方法,該方法在獲取鍵值對(duì)時(shí),如果鍵不存在則返回默認(rèn)值,文中通過(guò)一個(gè)統(tǒng)計(jì)網(wǎng)站用戶(hù)點(diǎn)擊次數(shù)的應(yīng)用場(chǎng)景,詳細(xì)展示了getOrDefault()的用法,需要的朋友可以參考下
    2025-02-02

最新評(píng)論

普格县| 云霄县| 尼木县| 池州市| 海林市| 义马市| 墨玉县| 金门县| 南昌县| 金门县| 祥云县| 万源市| 鹤峰县| 岳阳市| 舒兰市| 河北省| 泸水县| 克拉玛依市| 墨玉县| 怀仁县| 吉木乃县| 溧阳市| 通州区| 石渠县| 福鼎市| 宜昌市| 绿春县| 卓资县| 禄劝| 开远市| 南阳市| 北安市| 山丹县| 静乐县| 肇东市| 吉隆县| 邳州市| 绥芬河市| 南平市| 盐边县| 密山市|