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:如果总是在锁释放之前调用notify(),那么等待的线程如何获得相同的锁?_Java_Multithreading - Fatal编程技术网

java:如果总是在锁释放之前调用notify(),那么等待的线程如何获得相同的锁?

java:如果总是在锁释放之前调用notify(),那么等待的线程如何获得相同的锁?,java,multithreading,Java,Multithreading,我想我已经知道了这个问题的答案,但是,我想阅读您的意见,以确保我真正理解java线程的状态机(或图)是如何工作的 假设线程A在返回给定值之前运行notify(): public class baz{ // Thread B runs this: public synchronized void bar(){ wait(); } // Thread A runs this: public synchronized int foo(){

我想我已经知道了这个问题的答案,但是,我想阅读您的意见,以确保我真正理解java线程的状态机(或图)是如何工作的

假设线程A在返回给定值之前运行notify()

public class baz{

    // Thread B runs this:
    public synchronized void bar(){
       wait();
    } 

    // Thread A runs this:
    public synchronized int foo(){
       notify();
       return 11;
    }
}
notify()将在线程A释放锁之前被调用(这将在返回11语句之后发生)。 那么,等待这个锁的线程B(通过wait()方法)如何获得仍然由线程a持有的锁呢? 注意,当通知线程B时,线程A尚未释放锁

因此,我对这种情况的看法如下:

调用wait()后,线程B将其状态从Running更改为Waiting。 在接收到通知(来自线程Anotify()方法)后,线程B将从wait()返回,将其状态更改为Runnable,并尝试获取锁。由于线程A尚未释放锁,因此线程B将在对象的监视器上被阻止,并将其状态从Runnable传递到blocked。 最后,在线程A释放锁后,线程B将获取锁并将其状态从阻塞传递到运行


是这样吗?关于这个问题,我想了解的是,当线程从一个已获取的锁同步的wait()返回时,会发生什么情况

是的,你的解释是正确的

在对象上调用
wait()
时,调用线程将添加到对象的线程中。当它是
notify()
ied时,它将从该等待集中移除,并在对象上执行(它位于该对象上的
同步
块中)。该锁定操作将阻止当前线程,直到其完成,即锁定对象监视器


这与两个线程试图在同一对象上输入
synchronized
块时的行为完全相同。到达的第一个线程将锁定对象监视器,立即完成锁定对象。另一个线程阻塞,直到其锁定操作完成,即在第一个线程解锁监视器之后

这意味着return语句不能释放锁?问题的例子可能是僵局?我们不应该在同步方法中使用return语句?请您解释一下,或者给我一个链接,可以让我清楚这些概念。@UnKnown
return
本身并不能解除锁。如果
return
语句与
synchronized
块或方法一起出现,则是
return
导致的操作,即离开该块或方法,将释放锁。