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
仅在重新获取监视器后返回。)