java:如果总是在锁释放之前调用notify(),那么等待的线程如何获得相同的锁?
我想我已经知道了这个问题的答案,但是,我想阅读您的意见,以确保我真正理解java线程的状态机(或图)是如何工作的 假设线程A在返回给定值之前运行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(){
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语句?请您解释一下,或者给我一个链接,可以让我清楚这些概念。@UnKnownreturn
本身并不能解除锁。如果return
语句与synchronized
块或方法一起出现,则是return
导致的操作,即离开该块或方法,将释放锁。