【趣味图解】线程同步与通讯:从抢奶茶看透synchronized、ReentrantLock和wait/notify

哈喽,各位铁子👋!今天咱们不聊枯燥的理论,就用「奶茶店抢最后一杯芋泥波波」的故事,把线程同步和通讯这俩老大难问题给盘明白!

先抛个场景:奶茶店只剩1杯芋泥波波,有10个线程(顾客)同时来买,如果不加控制,大概率会出现"超卖"(1杯奶茶被卖10次),这就是多线程并发的"线程不安全"问题。而线程同步,就是给这场抢购加"规则"------你买完,我再买!

四、线程同步:给抢购加"排队规则"

同步的核心:协同步调,即你买完,我再买。本质是给共享资源(最后1杯奶茶)加"锁",同一时间只允许一个线程(顾客)操作,避免并发冲突。

方式一:同步代码块

这是最灵活的同步方式,核心是给一段代码加锁,只有拿到"钥匙"的线程才能执行代码块里的逻辑。

复制代码

关键说明 :lock对象必须是"唯一的"(比如全局/静态对象),如果每个线程都new一个lock,锁就失效了------相当于每人一把钥匙,还是会抢乱!

方式二:同步方法

把整个方法变成"同步区",不用手动写锁对象,JVM会自动分配钥匙:

  • 非static同步方法:钥匙是this(当前对象)

  • static同步方法:钥匙是类名.class(类对象,全局唯一)

复制代码

关键说明:同步方法的锁范围是整个方法,适合逻辑简单的场景;如果只需要同步一小段代码,用同步代码块更高效。

方式三:ReentrantLock(可重入锁)

JDK1.5新增的手动锁,比synchronized更灵活(支持公平锁/非公平锁、可中断等),核心是"手动加锁+手动解锁",解锁必须放finally里(避免异常导致锁没释放)。

复制代码

关键说明 :ReentrantLock是"可重入"的------同一个线程可以多次加锁,只要解锁次数和加锁次数一致就行。

五、线程通讯:买奶茶前先等"制作完成"

场景升级:奶茶店不仅只剩1杯,还得等店员(生产线程)做完这杯奶茶,顾客(消费线程)才能买。这时候就需要线程之间"传话"------这就是线程通讯!

核心方法(钥匙对象的专属方法)

  • wait():干完了?没干完我交出钥匙等通知(顾客:奶茶没做好,我把钥匙还回去,等店员喊我)

  • notify():开始干!通知等钥匙的人(店员:奶茶做好了,喊排队等的顾客来买)

⚠️ 注意:wait()/notify()必须在同步代码块/同步方法里调用(必须先拿到钥匙),否则会抛IllegalMonitorStateException!

sleep和wait的核心区别(必记)

  • sleep:拿着钥匙睡大觉(顾客拿到钥匙了,哪怕不买,也攥着钥匙眯5分钟,别人根本碰不到奶茶)

  • wait:交出钥匙等通知(顾客没拿到奶茶,主动把钥匙还回去,店员可以先做奶茶,等做好了再喊顾客拿钥匙)

线程通讯实战(店员做奶茶+顾客买奶茶)

复制代码

输出结果:

店员:开始做芋泥波波~ 店员:奶茶做好了!喊顾客来买~ 顾客小王:买到最后1杯芋泥波波,美滋滋~

总结

  1. 线程同步的核心是加锁,保证共享资源同一时间只有一个线程操作,核心方式有同步代码块、同步方法、ReentrantLock;

  2. 线程通讯依赖wait()/notify(),必须在同步环境下调用,且wait()会释放锁,sleep()不会;

  3. 记住奶茶店的例子:同步是"排队买",通讯是"做好了再喊你买",线程问题瞬间变简单~

如果觉得这篇文章有用,记得点赞+收藏🌟!关注我,后续解锁更多趣味Java多线程知识点~

相关推荐
爱喝水的鱼丶1 小时前
SAP-ABAP:ECC→S/4HANA ABAP 迁移升级指南——程序改造、语法兼容与性能优化 导语
运维·开发语言·性能优化·sap·abap·经验交流·开发交流
w_zero_one1 小时前
算法--模拟
java·数据结构·算法
小灰灰搞电子1 小时前
Rust+Slint 实现FTP客户端调试助手源码分享
开发语言·后端·rust
外收内放1 小时前
面向对象高级(实战案例)
开发语言·python·学习
Javatutouhouduan1 小时前
阿里1658页Java面试题总结(含答案)
java·高并发·java面试·java面试题·后端开发·java程序员·java八股文
秋天的怀念_David2 小时前
算法一千零一夜 · 第十三夜 幻方,武侠世界里的数学迷宫
java·程序人生·算法
专业程序开发源2 小时前
springboot欧缇蔓月子中心管理系统82697-计算机课程设计、毕业设计
java·spring boot·后端·python·spring·django·课程设计
秋天的怀念_David2 小时前
算法一千零一夜 · 第十四夜 幻方与奇妙的二进制
java·程序人生·算法
thefool1122662 小时前
网络编程^
java
薛定e的猫咪2 小时前
(ICLR 2020)MAML 靠的不是快速学习,而是特征复用
人工智能·深度学习·学习·算法·机器学习