wait notify的正确使用
先看看 sleep(long n)和 wait(long n)的区别:
- sleep是Thread方法,而wait是Object的方法
- slee不需要强制和synchronized配合使用,但wait需要和synchronized一起使用(需要拿到对象使用权才能进入对象的waitset中)
- sleep在睡眠的同时,不会释放对象锁,但wait在等待的时候会释放对象锁
- 它们的状态都是TIMED-WAITING
wait notify的正确使用姿势:
// 多个等待线程
synchronized(lock) {
while(条件不成立) {
lock.wait();
}
// 干活
}
// 另一个唤醒线程
synchronized(lock) {
lock.notifyAll(); // 这里不能用notify,因为notify是随机唤醒一个线程,或出现虚假唤醒的情况
}