wait() 方法的执行机制非常复杂,它不是一个普通的 Java 方法,而是定义在 Object 类的一个 native 方法,由 JVM 的 C 代码实现。
当某线程调用 wait() 方法后,此线程会进入等待状态,但 wait() 方法并不会立即返回,而是直到将来某个时刻,此线程从等待状态被其他线程唤醒后,wait() 方法才会返回,然后继续执行下一条语句。
必须在 synchronized 块中才能调用 wait() 方法,假设某线程调用 wait() 方法,会释放此线程获得的锁,当某一时刻 wait() 方法返回后,此线程又会重新试图获得锁。
只能在锁对象上调用wait()方法。
使用 notifyAll() 将唤醒所有当前正在this锁等待的线程;使用 notify() 只会唤醒其中一个(具体哪个依赖操作系统,有一定的随机性)。
通常来说,notifyAll()更安全。有些时候,如果我们的代码逻辑考虑不周,用notify()会导致只唤醒了一个线程,而其他线程可能永远等待下去醒不过来了。
- 以上内容来自 廖雪峰的官方网站
- 侵权删