java中wait方法
`wait` 方法是 Java 中 `Object` 类提供的一个线程协作方法,主要用于让当前线程进入等待状态,直到其他线程调用同一对象的 `notify` 或 `notifyAll` 将其唤醒。它和 Java 的多线程同步机制密切相关,常与 `synchronized` 关键字配合使用。
基本含义与用途
调用 `wait` 后,当前线程会释放它持有的对象锁,并进入该对象的等待队列,直到被唤醒或等待时间到期。它通常用于生产者-消费者这类场景:一个线程发现条件不满足时先等待,另一个线程改变条件后再通知它继续。`wait` 有三个重载形式:无参版本会一直等待,带超时参数的版本会在指定毫秒后自动返回,避免无限期阻塞。
常见问题
最常见的问题是未在 `synchronized` 块中调用 `wait`,这会直接抛出 `IllegalMonitorStateException`,因为线程必须先持有对象锁才能等待。另一个问题是把 `wait` 和 `sleep` 混淆:`sleep` 不释放锁,只是让线程暂停;`wait` 会释放锁,让其他线程有机会进入同步块。此外,等待条件应该用 `while` 循环检查而不是 `if`,因为线程被唤醒后条件可能仍不满足,需要再次判断,否则容易出现虚假唤醒导致的逻辑错误。
怎么判断与怎么选
判断是否该用 `wait`,关键看是否需要“释放锁并等待某个条件成立”。如果只是想让线程暂停一段时间、不涉及锁的释放,用 `sleep` 更合适;如果是多个线程围绕同一共享状态协作,且需要相互通知,就用 `wait`/`notify` 组合。使用时注意:始终在同步块内调用,用 `while` 包裹条件判断,优先考虑带超时的 `wait` 以避免永久阻塞。现代 Java 中也可以考虑 `Condition` 等更灵活的替代方案,但理解 `wait` 仍是掌握线程协作的基础。