Java中synchronized關(guān)鍵字鎖的力度與位置示例詳解
一、引言
synchronized是Java并發(fā)編程中最常用的同步工具。它通過“對象鎖”來保證臨界區(qū)代碼的線程安全。不同位置的synchronized鎖定范圍(鎖的力度)不同,直接影響程序的并發(fā)性能和正確性。本文將圍繞synchronized的不同使用位置,深入剖析其設(shè)計(jì)思想、技巧、優(yōu)缺點(diǎn)、源碼實(shí)現(xiàn),并結(jié)合實(shí)際業(yè)務(wù)場景,給出調(diào)試與優(yōu)化建議。同時(shí),探討與其他技術(shù)棧的集成與高階應(yīng)用。
二、主流程環(huán)節(jié)與設(shè)計(jì)思想
1. 方法級鎖(對象鎖/類鎖)
設(shè)計(jì)思想:
鎖定整個(gè)方法,保證同一對象的該方法同時(shí)只被一個(gè)線程執(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) |
|---|---|
| 簡單易用,鎖粒度大,易于保證安全 | 并發(fā)度低,可能導(dǎo)致性能瓶頸 |
2. 代碼塊級鎖(細(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ò),鎖對象選擇需謹(jǐn)慎 |
3. 鎖對象選擇與鎖力度
- this:鎖當(dāng)前實(shí)例,影響所有實(shí)例方法。
- 類對象Class:鎖類,影響所有靜態(tài)方法。
- 自定義鎖對象:可以精細(xì)化控制鎖的范圍,適用于部分資源共享。
核心代碼:
private final Object customLock = new Object();
public void customLockMethod() {
synchronized (customLock) {
// 關(guān)鍵業(yè)務(wù)邏輯
}
}
三、源碼解析與速記口訣
Java synchronized底層原理
synchronized的實(shí)現(xiàn)依賴于JVM的監(jiān)視器鎖(Monitor),對應(yīng)字節(jié)碼中的monitorenter和monitorexit指令。
源碼分析(偽代碼注釋):
public synchronized void example() {
// JVM會自動在方法入口處加 monitorenter
// 臨界區(qū)代碼
// JVM會自動在方法出口處加 monitorexit
}
逐行注釋:
- 方法簽名加
synchronized,JVM自動加鎖,無需手動。 - 進(jìn)入方法即持有對象鎖,其他線程需等待。
- 方法退出自動釋放鎖。
速記口訣:
“方法加鎖,入口即鎖,出口即放;代碼塊鎖,對象自選,范圍自控。”
四、實(shí)際業(yè)務(wù)場景舉例
場景1:銀行賬戶轉(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對象,避免并發(fā)轉(zhuǎn)賬導(dǎo)致數(shù)據(jù)不一致。
優(yōu)化技巧:
- 用代碼塊鎖定兩個(gè)Account對象,避免死鎖。
- 使用自定義鎖對象數(shù)組,按賬戶ID哈希分段鎖,提升并發(fā)。
五、調(diào)試與優(yōu)化技巧
- 鎖對象選擇:鎖對象越細(xì),性能越好,但越難保證安全。
- 死鎖調(diào)試:通過
jstack分析線程堆棧,定位死鎖點(diǎn)。 - 鎖競爭優(yōu)化:減少鎖范圍、使用并發(fā)容器、分段鎖等技術(shù)。
六、與其他技術(shù)棧集成方案
- JUC包:如
ReentrantLock、ReadWriteLock等,靈活控制鎖粒度和公平性。 - Spring事務(wù):可通過
synchronized與Spring的事務(wù)管理結(jié)合,保證數(shù)據(jù)一致性。 - 分布式鎖:如Redis、ZooKeeper實(shí)現(xiàn)跨進(jìn)程鎖,解決多JVM同步問題。
七、底層實(shí)現(xiàn)、高級算法與架構(gòu)演進(jìn)
1. JVM Monitor鎖機(jī)制
- 偏向鎖、輕量級鎖、重量級鎖:JVM根據(jù)競爭情況自動升級鎖類型。
- 鎖消除、鎖粗化:JIT編譯器優(yōu)化,減少無意義鎖操作。
- CAS算法:
ReentrantLock等并發(fā)包底層采用無鎖CAS,提高性能。
2. 架構(gòu)演進(jìn)
- 早期:粗粒度同步,易死鎖,性能低。
- 后期:細(xì)粒度鎖、分段鎖、鎖分離,提升并發(fā)性能。
- 分布式:引入分布式鎖,支持橫向擴(kuò)展。
八、權(quán)威資料與參考文獻(xiàn)
九、全文總結(jié)與系統(tǒng)性認(rèn)知
synchronized的鎖定位置決定了鎖的力度和并發(fā)性能。方法級鎖適合簡單場景,代碼塊鎖適合性能敏感業(yè)務(wù)。鎖對象選擇決定了同步范圍,需結(jié)合實(shí)際業(yè)務(wù)合理設(shè)計(jì)。底層實(shí)現(xiàn)依賴JVM Monitor鎖,現(xiàn)代架構(gòu)通過鎖優(yōu)化、分段鎖、CAS等技術(shù)提升并發(fā)。與JUC包、Spring、分布式鎖等技術(shù)棧集成,可實(shí)現(xiàn)更復(fù)雜的并發(fā)控制。
知其然更知其所以然:
- 明確鎖定范圍,理解鎖的底層原理。
- 合理選擇鎖對象,提升并發(fā)性能。
- 掌握調(diào)試與優(yōu)化技巧,避免死鎖與性能瓶頸。
- 學(xué)會與其他技術(shù)棧集成,構(gòu)建高性能并發(fā)系統(tǒng)。
附:速查表
| 位置 | 鎖對象 | 并發(fā)度 | 適用場景 |
|---|---|---|---|
| 方法級鎖 | this/Class | 低 | 簡單同步,易維護(hù) |
| 代碼塊鎖 | 自定義對象 | 高 | 性能敏感,復(fù)雜同步 |
| JUC鎖 | Lock對象 | 更高 | 公平性、可重入需求 |
| 分布式鎖 | Redis/ZK等 | 跨JVM | 分布式系統(tǒng) |
希望本文能幫助你全面理解synchronized鎖的力度與位置選擇,提升并發(fā)編程能力。
到此這篇關(guān)于Java中synchronized關(guān)鍵字鎖的力度與位置的文章就介紹到這了,更多相關(guān)Java synchronized關(guān)鍵字鎖內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 深入理解java中的synchronized關(guān)鍵字
- 詳解Java中synchronized關(guān)鍵字的死鎖和內(nèi)存占用問題
- Java中synchronized關(guān)鍵字修飾方法同步的用法詳解
- java多線程編程之使用Synchronized關(guān)鍵字同步類方法
- Java關(guān)鍵字volatile和synchronized作用和區(qū)別
- 舉例講解Java中synchronized關(guān)鍵字的用法
- 實(shí)例解析Java中的synchronized關(guān)鍵字與線程安全問題
- 深入了解Java中Synchronized關(guān)鍵字的實(shí)現(xiàn)原理
- java基本教程之synchronized關(guān)鍵字 java多線程教程
- java synchronized關(guān)鍵字的用法
相關(guān)文章
如何將默認(rèn)的maven倉庫改為阿里的maven倉庫
這篇文章主要介紹了如何將默認(rèn)的maven倉庫改為阿里的maven倉庫,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12
Java?Socket編程從零到實(shí)戰(zhàn)詳解(完整實(shí)戰(zhàn)案例)
這篇文章主要介紹了Java?Socket編程從零到實(shí)戰(zhàn)詳解,本文給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧2025-04-04
SpringBoot中5種動態(tài)代理的實(shí)現(xiàn)方案
在SpringBoot應(yīng)用中,動態(tài)代理被廣泛用于實(shí)現(xiàn)事務(wù)管理、緩存、安全控制、日志記錄等橫切關(guān)注點(diǎn),下面小編為大家介紹一下SpringBoot中5種動態(tài)代理的實(shí)現(xiàn)方案吧2025-04-04
Spring中@Controller與@RestController核心解析實(shí)戰(zhàn)指南
本文系統(tǒng)解析了Spring MVC中@Controller、@RestController和@RequestMapping的核心功能與最佳實(shí)踐,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2025-11-11
IDEA JetBrains Mono字體介紹和安裝教程(詳解)
這篇文章主要介紹了IDEA JetBrains Mono字體介紹和安裝教程,本給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03
SpringBoot整合mybatis-plus快速入門超詳細(xì)教程
mybatis-plus 是一個(gè) Mybatis 的增強(qiáng)工具,在 Mybatis 的基礎(chǔ)上只做增強(qiáng)不做改變,為簡化開發(fā)、提高效率而生,本文給大家分享SpringBoot整合mybatis-plus快速入門超詳細(xì)教程,一起看看吧2021-09-09

