java:wait(),notify()和synchronized块
我了解到调用Object的wait()
方法将释放对象监视器(如果存在)。
但是我有一些关于通过另一个线程调用此对象的notify()
问题:
-
如果另一个(第3个)线程同时拥有对象监视器,那么等待线程是否会被唤醒?
-
如果第三个线程在这个对象上调用
wait()
,那么等待线程会被唤醒吗? -
是否可以确定线程是否在等待通知特定对象(java 1.4 / java 5)
-
如果在
finalize()
方法中调用wait()
会发生什么?
-
notify
会唤醒一个线程在监视器上等待。 除非直到监视器无主,否则不能运行任何线程; 必须在同步块中调用wait(),因此必须保持锁定以继续运行该块。 - 没有保证。 调用
notifyAll
为所有线程提供唤醒机会 。 - 不知道。 你可以让线程设置一个变量,说它在进入睡眠状态之前等待…
- 这可能是一个坏主意。 你能想出一个必要的情况吗?
从线程调用wait()时,该线程停止执行并将其添加到对象的waitset中。 当你从另一个线程调用notify()时,会唤醒来自waitset的随机线程,如果你调用notifyAll(),则所有线程都可以执行。
当你调用notify()时,线程已准备好运行,但它并不意味着它会立即执行,所以要小心。
-
它会随机从waitset中唤醒一个线程。
-
你不知道哪一个会先被唤醒,它不会遵循任何顺序。
-
Thread.getState()
-
你会产生死锁。
-
这就是你有
notify()
和notifyAll()
方法的原因。 前者唤醒一个等待对象的线程,后者唤醒所有线程。 如果在另一个线程中调用wait()
则不会唤醒wait()
线程。 -
没有。
-
只能调用
thread.holdsLock(obj)
来查看线程是否在特定对象上保存监视器锁。 -
不要在finalize方法中调用
wait()
。
2:不一定。 notify()
唤醒其中一个等待线程。 它可能是原始的或第三个。
3:使用thread.getState()
可以看出一个线程是否正在等待一个对象,但我不知道你是否总能确切地找出它是哪个对象。