synchronized(this) 用法详解

news/2025/11/27 17:42:55/文章来源:https://www.cnblogs.com/yppah/p/19278914

基本概念

synchronized(this) 是 Java 中的一种同步机制,通过对当前对象实例加锁来保证线程安全。当一个线程进入被 synchronized(this) 修饰的代码块时,会获取当前对象的锁,其他线程必须等待该线程释放锁后才能进入。

基本语法

public class MyClass {public void method() {synchronized(this) {// 需要同步保护的代码// 同一时刻只有一个线程能执行这里的代码}}
}

使用场景详解

1. 实例变量的线程安全操作

public class Counter {private int count = 0;// 不安全的递增方法public void unsafeIncrement() {count++; // 非原子操作,可能出现竞态条件}// 安全的递增方法public void safeIncrement() {synchronized(this) {count++;}}// 获取当前计数值public int getCount() {synchronized(this) {return count;}}
}

2. 复杂业务逻辑的原子性保证

public class BankAccount {private double balance;public BankAccount(double initialBalance) {this.balance = initialBalance;}public boolean withdraw(double amount) {synchronized(this) {// 检查余额是否充足if (balance >= amount) {// 模拟处理时间try {Thread.sleep(100);} catch (InterruptedException e) {Thread.currentThread().interrupt();}balance -= amount;return true;}return false;}}public void deposit(double amount) {synchronized(this) {// 模拟处理时间try {Thread.sleep(50);} catch (InterruptedException e) {Thread.currentThread().interrupt();}balance += amount;}}public double getBalance() {synchronized(this) {return balance;}}
}

3. 多步骤操作的原子性保证

public class InventoryManager {private Map<String, Integer> inventory = new HashMap<>();public InventoryManager() {// 初始化库存inventory.put("item1", 100);inventory.put("item2", 50);}// 批量扣减库存 - 需要保证原子性public boolean deductInventory(Map<String, Integer> itemsToDeduct) {synchronized(this) {// 第一步:检查所有商品库存是否充足for (Map.Entry<String, Integer> entry : itemsToDeduct.entrySet()) {String itemId = entry.getKey();Integer quantity = entry.getValue();Integer currentStock = inventory.get(itemId);if (currentStock == null || currentStock < quantity) {return false; // 库存不足,整个操作失败}}// 第二步:扣减所有商品库存for (Map.Entry<String, Integer> entry : itemsToDeduct.entrySet()) {String itemId = entry.getKey();Integer quantity = entry.getValue();Integer currentStock = inventory.get(itemId);inventory.put(itemId, currentStock - quantity);}return true;}}public int getStock(String itemId) {synchronized(this) {return inventory.getOrDefault(itemId, 0);}}
}

4. 缓存更新的线程安全

public class CachedDataService {private Map<String, Object> cache = new HashMap<>();private long lastUpdateTime = 0;private static final long CACHE_TIMEOUT = 60000; // 1分钟public Object getData(String key) {synchronized(this) {// 检查缓存是否过期if (System.currentTimeMillis() - lastUpdateTime > CACHE_TIMEOUT) {refreshCache();}return cache.get(key);}}public void putData(String key, Object data) {synchronized(this) {cache.put(key, data);lastUpdateTime = System.currentTimeMillis();}}private void refreshCache() {// 刷新缓存逻辑cache.clear();// 重新加载数据...lastUpdateTime = System.currentTimeMillis();}public void clearCache() {synchronized(this) {cache.clear();lastUpdateTime = 0;}}
}

与其他同步方式的比较

1. synchronized 方法 vs synchronized(this)

public class ComparisonExample {private int value = 0;// 方式1:同步整个方法public synchronized void method1() {value++;// 其他操作...}// 方式2:同步代码块public void method2() {// 一些不需要同步的操作System.out.println("不需要同步的操作");synchronized(this) {value++;// 需要同步的操作}// 更多不需要同步的操作System.out.println("更多不需要同步的操作");}
}

2. synchronized(this) vs synchronized(object)

public class LockGranularityExample {private final Object lock1 = new Object();private final Object lock2 = new Object();private int counter1 = 0;private int counter2 = 0;// 粗粒度锁定 - 锁定整个对象public void coarseGrainedOperation() {synchronized(this) {counter1++;counter2++;}}// 细粒度锁定 - 分别锁定不同的资源public void fineGrainedOperation() {synchronized(lock1) {counter1++;}synchronized(lock2) {counter2++;}}
}

实际应用场景

1. 单例模式中的懒加载

public class LazySingleton {private static LazySingleton instance;private LazySingleton() {}public static LazySingleton getInstance() {if (instance == null) {synchronized(LazySingleton.class) {if (instance == null) {instance = new LazySingleton();}}}return instance;}
}

2. 生产者-消费者模式

public class Buffer {private final Queue<Integer> queue = new LinkedList<>();private final int capacity = 10;public void produce(int item) throws InterruptedException {synchronized(this) {while (queue.size() == capacity) {// 缓冲区满,等待消费者消费wait();}queue.offer(item);System.out.println("生产: " + item);notifyAll(); // 通知等待的消费者}}public int consume() throws InterruptedException {synchronized(this) {while (queue.isEmpty()) {// 缓冲区空,等待生产者生产wait();}int item = queue.poll();System.out.println("消费: " + item);notifyAll(); // 通知等待的生产者return item;}}
}

3. 状态机的状态转换

public class StateMachine {private enum State {IDLE, PROCESSING, COMPLETED, ERROR}private State currentState = State.IDLE;public void startProcessing() {synchronized(this) {if (currentState == State.IDLE) {currentState = State.PROCESSING;System.out.println("开始处理...");} else {throw new IllegalStateException("不能从 " + currentState + " 状态开始处理");}}}public void completeProcessing() {synchronized(this) {if (currentState == State.PROCESSING) {currentState = State.COMPLETED;System.out.println("处理完成");} else {throw new IllegalStateException("不能在 " + currentState + " 状态完成处理");}}}public State getCurrentState() {synchronized(this) {return currentState;}}
}

注意事项和最佳实践

1. 避免死锁

public class DeadlockAvoidance {private final Object lockA = new Object();private final Object lockB = new Object();// 错误的做法 - 可能导致死锁public void badMethod1() {synchronized(lockA) {synchronized(lockB) {// 操作...}}}public void badMethod2() {synchronized(lockB) {synchronized(lockA) {// 操作...}}}// 正确的做法 - 统一加锁顺序public void goodMethod1() {synchronized(lockA) {synchronized(lockB) {// 操作...}}}public void goodMethod2() {synchronized(lockA) {  // 保持相同的加锁顺序synchronized(lockB) {// 操作...}}}
}

2. 减少锁的持有时间

public class LockHoldingOptimization {private List<String> dataList = new ArrayList<>();// 不好的做法 - 锁持有时间过长public void badPractice() {synchronized(this) {// 执行耗时操作expensiveOperation();// 添加数据dataList.add("data");}}// 好的做法 - 减少锁持有时间public void goodPractice() {// 先执行耗时操作String result = expensiveOperation();// 只在必要时加锁synchronized(this) {dataList.add(result);}}private String expensiveOperation() {// 模拟耗时操作try {Thread.sleep(1000);} catch (InterruptedException e) {Thread.currentThread().interrupt();}return "processed_data";}
}

总结

synchronized(this) 的主要特点和使用建议:

适用场景:

保护实例变量的并发访问
保证多步骤操作的原子性
实现简单的线程同步

注意事项:

锁的是当前对象实例,同一类的不同实例之间不会互斥
可能影响性能,应尽量减少锁的持有时间
注意避免死锁

替代方案:

对于更复杂的并发控制,可以考虑使用 java.util.concurrent 包中的工具类
对于读多写少的场景,可以考虑使用 ReentrantReadWriteLock
对于无锁编程,可以考虑使用 Atomic 类

synchronized(this) 是 Java 中最基础也是最重要的同步机制之一,正确使用能够有效解决大部分线程安全问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/978774.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

项目写交付文档,数据库文档生成

我们可以使用工具,快速生成数据库文档,地址是:https://gitee.com/dotnetchina/DBCHM/releases

2025年琉璃瓦厂家推荐排行榜:哪家好?哪家靠谱?选哪家?——基于 CNPP 榜单的对比评测

一、用户在搜这些词时,其实要解决什么决策问题? 典型检索词:“琉璃瓦厂家” “琉璃瓦厂家推荐” “琉璃瓦厂家排行榜” “琉璃瓦厂家哪家好” “琉璃瓦厂家选哪家” “琉璃瓦厂家哪家靠谱”背后的共同需求不是“看广…

Kafka在Spring Boot生态中的浅析与应用 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025年11月成都电线电缆厂家最新推荐,高压电缆、中压电缆、低压电缆、铜芯电缆、铝芯电缆、企业综合服务能力与产品特色深度解析

随着西南地区基础设施建设持续升级,以及新能源、轨道交通等领域的快速发展,各类工程项目对线缆产品的品质要求与日俱增。用户在选购线缆产品时面临诸多考量——如何辨别企业综合实力、如何匹配项目需求的产品规格、如…

2025 年最新屏蔽泵厂家排行榜:高温 / 自吸 / 化工等多类型屏蔽泵最新推荐,助力企业精准选品立式 / 液下 / 多级 / 维修 / 低温 / 液化气屏蔽泵推荐

引言 当前,锂电新能源、新材料、煤化工、环保、制药等领域飞速发展,对实现无泄漏输送的屏蔽泵需求日益增长。但市场上屏蔽泵品牌繁杂,产品质量参差不齐,部分企业技术落后、设备陈旧,导致产品在高温、高压等特殊工…

NeurIPS 2025|让AI读懂第一视角的“内心独白”!浙大等联合突破性实现自我中心视频推理

NeurIPS 2025|让AI读懂第一视角的“内心独白”!浙大等联合突破性实现自我中心视频推理论文名称:EgoThinker: Unveiling Egocentric Reasoning with Spatio-Temporal CoT 发布时间:2025年10月28日 👉一键直达论文 …

实验5 MapReduce初级编程实践

实验步骤 (一)编程实现文件合并和去重操作 对于两个输入文件,即文件A和文件B,请编写MapReduce程序,对两个文件进行合并,并剔除其中重复的内容,得到一个新的输出文件C。下面是输入文件和输出文件的一个样例供参考…

2025年燃气低氮热水锅炉加工厂权威推荐榜单:家庭燃气热水锅炉/立式卧式燃气热水锅炉/半吨燃气热水锅炉设备源头厂家精选

燃气低氮热水锅炉作为现代清洁供热系统的核心装备,其氮氧化物排放水平、热效率及运行稳定性直接关系到用户的环保合规性、运营成本与系统可靠性。随着"双碳"政策推进与环保标准的提升,市场对超低氮排放、高…

08.入门篇-Java程序运行原理

08.入门篇-Java程序运行原理8 Java程序运行原理———————————————————————————————————————————————————————————————————————————无敌小马…

rust关键字unsafe

一看到unsafe关键字,第一印象就是这代码危险的,还是别用了。其实呢,根据个人使用及理解,可以认为作为rust的一种行为扩展机制,胆子大一点做常人之不敢做的事。 在 Rust 中,unsafe 是一个特殊的关键字,它允许开发…

2025 年液化气泵厂家最新推荐榜,聚焦技术创新与质量保障的优质品牌深度解析无密封/磁力/倒罐/双端面机械密封/屏蔽/增压液化气泵公司推荐

引言 在石油化工、燃气、煤化工等关键领域的全球发展进程中,液化气泵作为输送低沸点易挥发性液体的核心设备,其性能与质量直接关系到企业生产的安全性、稳定性与效率。据国际流体机械协会(IFMA)2024 年度全球液化气…

完整教程:TouchDIVER Pro 触觉手套:Weart把火星岩石触感、手术操作感搬进 XR

完整教程:TouchDIVER Pro 触觉手套:Weart把火星岩石触感、手术操作感搬进 XR2025-11-27 17:34 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow…

【水印检查】字符串处理和矩阵的存入

暴力求解方法: 逐块检查; 关键:字符串处理;矩阵的存入和读取; 字符串处理: 基于< string >:(append)string cur = "";如果在字符串后面拼接上什么>东西:cur+="[str]";或者cur.app…

06.入门篇-AI编程助手

06.入门篇-AI编程助手6 AI编程助手 6.1 常见 AI 编程助手编程助手 公司 支持的IDE 地址 备注GitHub Copilot 微软+OpenAl VS Code、JetBrains、Visual Studio等 https://github.com/features/copilotAmazon Q 亚马逊 V…

高品质牛肉品牌推荐:安心之选,守护家庭餐桌

前言​ 牛肉作为优质蛋白质的重要来源,凭借丰富的营养与多元的烹饪方式,成为中国家庭餐桌的常客。随着消费升级,消费者对牛肉的需求已从 “吃” 转向 “吃口感、吃健康”,高品质、可溯源、安全健康成为核心诉求。​…

中药品牌十强排名彰显实力,好医生以完整产业链布局未来

在中医药蓬勃发展的大背景下,好医生集团作为中国医药行业的标杆企业,凭借其卓越的产品品质和持续的创新能力,在2025年中药品牌十强排名评选中展现出非凡实力。作为一家深耕中医药领域三十余年的现代化医药企业集团,…

2025年11月电线电缆最新推荐厂家,高压电缆、中压电缆、低压电缆、铜芯电缆、铝芯电缆、铝合金电缆多维度综合考量

当前电力工程、建筑施工、工业生产等场景对电线电缆的需求愈发精细化,传输稳定性、安全防护、场景适配等核心诉求不断升级,但市场上设备厂家资质良莠不齐,部分产品存在导电性能不达标、抗老化能力弱、售后响应滞后等…

从零部署网站客服系统:我踩过的域名和服务器坑,帮你省下几千块!

wx:llike620 gofly.v1kf.com 最近有朋友问我部署网站客服系统的事,让我想起自己第一次搭建时的迷茫。今天就把我的经验总结分享给大家,特别是关于域名和服务器的那点事儿——毕竟这是我当初最头疼的部分! 成本真的不…

U634637 Star way to heaven

像对偶图一样,转化成最小生成树问题(最小瓶颈生成树)。 稠密图求最小生成树使用 Prim 算法可以做到 \(O(m + n^2)\)。

【51单片机】【protues仿真】基于51单片机自动浇花强大的系统

【51单片机】【protues仿真】基于51单片机自动浇花强大的系统pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Cons…