线程 “各玩各的” 导致系统崩溃? 5 个 “对讲机” 让线程秒变 队友
电商秒杀时 10 个线程抢着修改库存,结果库存从 100 变成了 – 5!这种 “线程打架” 的坑 90% 的程序员都踩过。今天把线程比作 “施工队”,用 5 个工地场景讲透线程通信机制,看完再也不怕并发 Bug。

机制一:等待 / 通知 =“工人喊‘我好了,你上!’”
通俗解释:就像 A 工人挖好坑后喊 “坑挖完了!”(notify ()),B 工人才开始埋管道(wait () 被唤醒)。Object 类的 wait/notify 是最基础的 “对讲机”,必须配合 synchronized 使用(就像说话要先举手)。
经典场景:生产者消费者模型(厨师做好菜通知服务员端走)

机制二:信号量 =“工地门口限载 5 人”
核心功能:Semaphore 就像工地门禁,设置 permits=5 就只允许 5 个工人同时进入施工(控制并发数)。用完后调用 release ()“出门”,其他工人才能 acquire ()“进门”。
秒杀必用:限制 100 个线程同时抢单,防止数据库崩溃(对比之前讲的 RabbitMQ 限流)

机制三:CountDownLatch=“等所有工人到齐再开工”
倒计时功能:就像包工头说 “5 个工人到齐后才开始干活”,每个工人到了就 countDown () 减 1,直到计数器为 0 时,await () 的主线程才继续执行。
常用场景:启动服务器时,等 10 个服务都初始化完再对外提供接口。

机制四:CyclicBarrier=“工人到齐后开个会,然后继续干活”
循环栅栏:和 CountDownLatch 的区别是 —— 所有线程到达后会执行一个 barrierAction(如开例会),然后栅栏重置可以重复使用!就像 “每天早上 5 个工人到齐开 10 分钟早会,然后各自干活,明天继续”。

机制五:管道流 =“工人之间传纸条”
字节流通信:
PipedInputStream/PipedOutputStream 就像两个工人之间拉一根绳子传纸条,线程 A 通过输出流写字节,线程 B 通过输入流读字节,全程单向传输(类似之前讲的 RabbitMQ 消息传递)。

结尾灵魂拷问:你用对 “对讲机” 了吗?
场景选择题(评论区留下答案):
- 限制 3 个线程同时操作文件 → ?
- 等 10 个任务跑完再汇总结果 → ?
- 线程 A 做完后通知线程 B 开始 → ?
- (答案:1. Semaphore 2. CountDownLatch 3. wait/notify)




