某个线程在执行的过程中遇到条件不满足而使用的wait方法,就会进入waitset变成waiting状态
blocked是在等待锁,waiting是在等待owner线程调用notify或者notifyall方法,两种状态都不占用CPU时间片
object.wait() 直接变成重量级锁object.notify()object.notifyAll()
都必须在对象获得锁之后才能调用,必须放在同步代码块里面
object.wait(long timeout)
表示有时限的等待,如果在时限内没有其他线程唤醒它,就会重新获得锁继续运行
wait和sleep
- sleep是Thread方法,wait是Object方法
- sleep不强制和synchronized配合使用,wait需要和synchronized配合使用
- sleep不会释放对象锁,wait会释放(其他线程就可以释放锁)
- 它们的状态都是TIMED_WAITING
notify随机唤醒会导致虚假唤醒,改成notifyall
synchronized (lock) {while (!condition) {lock.wait();}//do
}//another Thread
synchornized (lock) {lock.notifyAll();
}