线程间通信:多线程开发的必备核心技能
大家好,我是程序员老王。今天咱们聊聊面试必问的线程间通信,这可是多线程开发的命脉!先送个福利:2025年最新Java面试宝典👉 点击下载(提取码:9b3g)

为什么线程间通信如此重要?
当多个线程操作共享资源时,线程间通信就像交通信号灯。比如电商秒杀场景,库存就是共享变量。没有正确的线程通信机制,轻则数据错乱,重则系统崩溃。面试官最爱问:"说说你知道的线程间通信方式?" 这题答好了,通过率直接飙升!
最基础的线程通信方式
等待/通知机制(wait/notify)
这是线程通信的基石。举个栗子:生产者生产数据后调用notify(),消费者通过wait()挂起等待:
// 生产者线程
synchronized(lock) {
data = produce();
lock.notify(); // 唤醒等待线程
}
// 消费者线程
synchronized(lock) {
while(data == null) {
lock.wait(); // 释放锁进入等待
}
consume(data);
}
关键点:
wait()会释放锁,notify()不释放锁- 必须用
while检查条件,避免虚假唤醒 - 同步代码块必须使用同一个锁对象

高级线程通信工具
Condition条件变量
比wait/notify更灵活,可以创建多个等待队列:
Lock lock = new ReentrantLock();
Condition condition = lock.newCondition();
// 等待方
lock.lock();
try {
while(!conditionSatisfied) {
condition.await(); // 相当于wait
}
} finally {
lock.unlock();
}
// 通知方
lock.lock();
try {
condition.signal(); // 相当于notify
} finally {
lock.unlock();
}
适合实现复杂生产者消费者模型,比如多对多场景的线程通信
CountDownLatch 倒计时门闩
让主线程等待所有子线程完成:
CountDownLatch latch = new CountDownLatch(3);
// 工作线程
void run() {
// ...执行任务
latch.countDown();
}
// 主线程
latch.await(); // 阻塞直到计数器归零
System.out.println("所有线程完成!");
常用于并行任务初始化,是线程间通信的经典同步工具。
实战中的线程通信技巧
- 避免忙等待:用
wait/notify替代while(true)循环,节省CPU - 锁粒度控制:同步块尽量只包含共享变量操作
- volatile信号:简单状态标记用volatile更轻量
- 线程中断:用
thread.interrupt()+InterruptedException优雅终止

面试避坑指南
被问到"线程间通信方式"时,千万别只说wait/notify!按这个层次回答:
- 基础:wait/notify + synchronized
- 进阶:Lock/Condition
- 工具类:CountDownLatch/CyclicBarrier/Semaphore
- 高级:BlockingQueue管道通信
最后分享个神器:需要购买面试鸭会员的同学,通过面试鸭返利网找我可返25元!海量真题+项目实战助你轻松通关。
线程间通信的本质就是协调与配合。掌握这些线程通信技巧,面对高并发场景就能从容设计线程协作模型。记住:好的线程间通信设计=系统稳定性+性能提升!


