一、原理
- Monitor中的Owner线程发现条件不满足,调用wait方法,即可进入WaitSet变为WAITING状态。
- BLOCKED和WAITING的线程都处于阻塞状态,不占用CPU时间片。
- BLOCKED线程会在Owner线程释放锁时唤醒。
- WAITING线程会在Owner线程调用notify或notifyAll时唤醒,但唤醒后并不意味着立刻获得锁,仍需进入EntryList重新竞争。
二、API
- obj.wait():让进入object监视器的线程到waitset等待。
- obj.notify():在object上正在waitset等待的线程中挑一个唤醒。
- obj.notifyAll():让object上正在waitset等待的线程全部唤醒。
三、正确用法
synchronized (lock){
while (条件不存在){
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//干活
}
//另一个线程
synchronized (lock){
lock.notifyAll();
}
四、与LockSupport的park&unpark相比:
- wait,notify和notifyAll必须配合Object Monitor一起使用,而park,unpark不必。
- park,unpark是以线程为单位来阻塞和唤醒线程,而notify只能随机唤醒一个等待线程,就不那么精确。
- park,unpark可以先unpark,而wait,notify不能先notify。