Java面试题更新 2026-08-05

在 Java 中,wait() 方法与 sleep() 方法有哪些不同?请从所属类、锁的释放、使用场景以及异常处理等方面进行说明。

后端开发技术原理问题排查Java

考察说明

考查对 Java 并发编程中线程控制基础方法的理解与区分。

回答思路

  1. 【回答框架 1】wait() 是 Object 类的方法,必须在 synchronized 同步块或方法中调用,调用后线程会释放对象的监视器锁,并进入等待状态,直到其他线程调用同一对象的 notify() 或 notifyAll() 方法唤醒。
  2. 【回答框架 2】sleep() 是 Thread 类的静态方法,调用后线程进入休眠状态,但不会释放任何锁,休眠时间结束后自动恢复运行,不需要在同步上下文中调用。
  3. 【回答框架 3】wait() 通常用于线程间协作,实现生产者-消费者等模式,需要配合锁和通知机制;sleep() 常用于模拟耗时操作或控制执行节奏,不涉及线程间通信。
  4. 【回答框架 4】异常处理方面,两者都会抛出 InterruptedException,但 wait() 还要求调用者持有锁,否则抛出 IllegalMonitorStateException;sleep() 则无此要求。
  5. 【回答框架 5】使用 wait() 时需注意虚假唤醒,建议在循环中检查条件;sleep() 则相对简单,但需注意休眠时间精度受系统调度影响。
  6. 【关键点 1】wait() 属于 Object 类,sleep() 属于 Thread 类。
  7. 【关键点 2】wait() 释放锁,sleep() 不释放锁。
  8. 【关键点 3】wait() 必须在同步块中调用,sleep() 无此限制。
  9. 【关键点 4】wait() 用于线程间协作,sleep() 用于暂停执行。
  10. 【关键点 5】两者都会抛出 InterruptedException。
  11. 【易错点 1】误以为 sleep() 会释放锁,导致死锁或资源占用问题。
  12. 【易错点 2】在非同步上下文中调用 wait() 会抛出 IllegalMonitorStateException。
  13. 【易错点 3】忽略虚假唤醒,未在循环中检查等待条件。