是否有任何限制调用wait()方法?

时间:2014-10-20 13:27:55

标签: java multithreading

有没有限制调用wait()方法?我们在Thread类中使用wait()和notify(),那么为什么java在Object类中给出了这些方法?

3 个答案:

答案 0 :(得分:3)

1)等待和通知不仅仅是普通方法或同步实用程序,而是它们是Java中两个线程之间的通信机制。如果通过任何java关键字(例如synchronized)无法使用此机制,那么Object类是使它们可用于每个对象的正确位置。记住同步和等待通知是两个不同的区域,不要混淆它们是相同的或相关的。同步是提供互斥并确保Java类的线程安全,如等待和通知是两个线程之间的通信机制。

2)锁定在每个对象的基础上可用,这是在Object类而不是Thread类中声明wait和notify的另一个原因。

3)在Java中为了进入代码的关键部分,线程需要锁定并等待锁定,他们不知道哪些线程持有锁而不知道锁定是否被某个线程保持并且他们应该等待锁定而不是知道同步块中的哪个线程并要求它们释放锁定。这个比喻适合于等待并通知对象类而不是Java中的线程。

这些只是我想到为什么wait和notify方法在Object类而不是Thread in Java中声明,并且你有不同的版本。实际上,Java设计者做出的另一个设计决定就是不支持Java中的运算符重载。无论如何,如果您有任何其他令人信服的理由,请发布等待,并且notify方法应该在Object类中,而不是在Thread上。

答案 1 :(得分:1)

是。您必须是对象的所有者(实际上是对象的监视器),您可以在其上调用wait()notify()。否则,您将获得IllegalMonitorStateException

为什么java在Object类中给出了那些方法? 因为,一个线程在对象的监视器上等待/通知。监视器属于Object。线程只能保持它。

答案 2 :(得分:1)

你不要在线程子类中使用wait和notify,除非在玩具示例中更容易让人感到困惑。对一个对象的一个​​对象调用wait和notify,该对象限制对内部数据结构的并发访问。线程获取并释放属于数据结构的锁。

特定对象的wait和notify方法只能由获取该对象锁的线程调用。