Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 调用wait()方法有任何限制吗?_Java_Multithreading - Fatal编程技术网

Java 调用wait()方法有任何限制吗?

Java 调用wait()方法有任何限制吗?,java,multithreading,Java,Multithreading,调用wait()方法有任何限制吗?我们在线程类中使用wait()和notify(),那么为什么java在对象类中给出了这些方法呢?是的。您必须是调用wait()或notify()的对象(实际上是对象的监视器)的所有者。否则,您将获得非法监视器状态异常 为什么java在对象类中提供这些方法? 因为,线程在对象的监视器上等待/通知。监视器属于该对象。线程只能容纳它。在线程子类中不使用wait和notify,除非在玩具示例中使用,这些示例更容易混淆,而不是有用。wait和notify是在对象上调用的,

调用wait()方法有任何限制吗?我们在线程类中使用wait()和notify(),那么为什么java在对象类中给出了这些方法呢?

是的。您必须是调用
wait()
notify()
的对象(实际上是对象的监视器)的所有者。否则,您将获得
非法监视器状态异常

为什么java在对象类中提供这些方法?
因为,线程在对象的监视器上等待/通知。监视器属于该对象。线程只能容纳它。

在线程子类中不使用wait和notify,除非在玩具示例中使用,这些示例更容易混淆,而不是有用。wait和notify是在对象上调用的,该对象被限制对内部数据结构的并发访问的对象用作锁。线程获取并释放属于数据结构的锁

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

1)Wait和notify不仅仅是普通的方法或同步工具,更是Java中两个线程之间的通信机制。如果这个机制不能通过任何java关键字(如synchronized)使用,那么对象类就是使它们对每个对象都可用的正确位置。记住,synchronized和wait notify是两个不同的区域,不要混淆它们是相同的或相关的。Synchronized是在两个线程之间的通信机制wait和notify的同时,提供互斥性,保证Java类的线程安全性,比如争用条件

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

3) 在Java中,为了进入代码的关键部分,线程需要锁并等待锁,它们不知道哪个线程持有锁,而只是知道锁被某个线程持有,它们应该等待锁,而不是知道哪个线程在同步块中并要求它们释放锁。这种类比适用于Java中对象类而非线程上的等待和通知


这就是我对为什么在Java中在对象类中声明wait和notify方法而不是在线程中声明方法的想法,而且您的版本和我的不同。实际上,它是Java设计器做出的另一个设计决策,比如不支持Java中的运算符重载。无论如何,如果您有任何其他令人信服的理由说明wait and notify方法应该在对象类中而不是在线程中,请发帖。

阅读javadoc。它完全解释了这一点。+1,人们可能想知道允许任何对象充当监视器是否是一个好的决定。