使用wait的时候,什么要使用while:
你或许有多个任务为同样的原因等待同样的锁, 并且第一个唤醒的任务或许已经改变了情况(甚至你不这么做,但是继承你的类可以这么做)。如果是这种情况,那么这个task就应该被暂停,直到满足条件。
当这个任务从它的等待状态中唤醒的时候,可能其他的任务已经改变了状态,以致于这个任务不能运行。只能继续等待。
还有情况是你的object lock可能被多种原因在等待(在这种情况下,你就必须用notifyAll()).这种情况下,你需要检查是否唤醒的是否正确,如果不是对应的唤醒,那么就必须继续wait()
此外:
什么是object monitor?
根据jdk 7的api来看:
This method should only be called by a thread that is the owner of this object’s monitor. A thread becomes the owner of the object’s monitor in one of three ways:
- By executing a synchronized instance method of that object.
- By executing the body of a synchronized statement that synchronizes on the object.
- For objects of type Class, by executing a synchronized static method of that class.
Only one thread at a time can own an object’s monitor.
notify方法只能被这个object的monitor拥有者调用。一个线程有三种方法成为这个object的monitor:
- 执行同一个instance的synchronized方法。
- 执行同一个instance的synchronized的block。
- 执行同一个Class, 执行静态的synchronized方法。