外观
一句话答案
sleep 是 Thread 方法不释放锁,wait 是 Object 方法释放锁且必须在 synchronized 中调用,用途也不同。
核心要点
| 维度 | sleep() | wait() |
|---|---|---|
| 所属类 | Thread | Object |
| 释放锁 | 不释放 | 释放 |
| 使用条件 | 任意位置 | 必须在 synchronized 中 |
| 唤醒方式 | 超时自动/interrupt | notify()/notifyAll()/超时 |
| 用途 | 暂停执行 | 线程间协作通信 |
| 异常 | InterruptedException | InterruptedException |
为什么 wait 必须在 synchronized 中?
- 防止 lost wake-up:如果不加锁,可能在 wait 之前 notify 已经发生
- wait 会原子地释放锁并进入等待队列
面试标准回答:
sleep 让当前线程暂停指定时间,不释放锁;wait 让当前线程等待,释放锁,直到被 notify 唤醒。本质区别在于是否释放锁和是否用于线程通信。
追问与易错
追问方向:
- wait 为什么必须在 synchronized 中?
- notify 和 notifyAll 的区别?
- Thread.sleep(0) 有什么用?
易错点:
- ❌ 忘记 wait/notify 配对使用
- ❌ sleep(0) 没有意义——可以触发线程调度
💡 记忆锚点
sleep 是"抱着锁睡觉"——到点自己醒,锁不松手,别人干等着。wait 是"放下锁去候客区等"——把锁让出来让别人用,直到有人 notify 叫你回来重新抢锁。一个霸道自顾自睡,一个礼让主动让位。