Skip to content
基础

一句话答案

sleep 是 Thread 方法不释放锁,wait 是 Object 方法释放锁且必须在 synchronized 中调用,用途也不同。

核心要点
维度sleep()wait()
所属类ThreadObject
释放锁不释放释放
使用条件任意位置必须在 synchronized 中
唤醒方式超时自动/interruptnotify()/notifyAll()/超时
用途暂停执行线程间协作通信
异常InterruptedExceptionInterruptedException

为什么 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 叫你回来重新抢锁。一个霸道自顾自睡,一个礼让主动让位。