Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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()和notify()_Java_Multithreading_Concurrency_Jvm_Synchronized - Fatal编程技术网

Java 重新访问对象wait()和notify()

Java 重新访问对象wait()和notify(),java,multithreading,concurrency,jvm,synchronized,Java,Multithreading,Concurrency,Jvm,Synchronized,虽然有很多关于这个话题的文章和帖子,但我还是有一些疑问。所以请帮助我理解。说我写: 1.Class A(){} 2.public static void main(String[] s){ 3. A obj= new A(); 4. synchronized(obj){ 5. while(!condition) 6. obj.wait(); 7. } 8.} 现在根据解释,如果我们不使用同步块,从睡眠中醒来的线程可能会丢失通知。但是第6行释放了

虽然有很多关于这个话题的文章和帖子,但我还是有一些疑问。所以请帮助我理解。说我写:

1.Class A(){}
 2.public static void main(String[] s){
 3. A obj= new A();
 4. synchronized(obj){ 
 5.       while(!condition)
 6.           obj.wait();
 7.  }
 8.}
现在根据解释,如果我们不使用同步块,从睡眠中醒来的线程可能会丢失通知。但是第6行释放了obj上的锁,即它的监视器属于另一个线程。 现在,当该线程调用notify()时,该线程如何得到通知,因为obj的监视器不属于该线程。此外,第4行代码只执行一次,而不是在该线程的每个唤醒事件上执行。那么,在等待()之前同步到底需要什么呢

编辑:“第4行代码只执行一次”错误假设。如回答中所述,同步块中的线程在从睡眠状态恢复后将重新获得锁。谢谢它的工作原理如中所述,重点是:

线程释放此监视器的所有权并等待,直到另一个线程通过调用notify方法或notifyAll方法通知等待此对象监视器的线程唤醒然后线程等待,直到它可以重新获得监视器的所有权并恢复执行。

因此,一旦通知等待线程,它将在继续执行下一条指令之前重新获取监视器(在您的情况下:
而(!condition)
)。

它的工作原理如中所述,重点是:

线程释放此监视器的所有权并等待,直到另一个线程通过调用notify方法或notifyAll方法通知等待此对象监视器的线程唤醒然后线程等待,直到它可以重新获得监视器的所有权并恢复执行。

因此,一旦通知等待线程,它将在继续执行下一条指令之前重新获取监视器(在您的情况下:
while(!condition)

“那么等待前同步()到底需要什么?”:条件是跨线程共享的,条件中的任何更改都应该是线程安全的,这就是同步的原因。这里的条件不是一些随机条件,但这是线程要等待的条件。 希望这有帮助。

“那么等待前同步()到底需要什么呢?”:条件是跨线程共享的,条件中的任何更改都应该是线程安全的,这就是同步的原因。这里的条件不是一些随机条件,但这是线程要等待的条件。
希望这有帮助。

如果不使用同步块,
wait
将抛出一个异常以开始。。。(和
wait
仅在重新获取监视器后返回。)如果不使用同步块,
wait
将引发异常以。。。(和
wait
仅在重新获取监视器后返回。)