[英]java: If notify() is always called before the lock release, how could a waiting threads acquire this same lock?
我认为我已经知道了该问题的答案,但是,我想阅读您的意见以确保我真正了解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;
}
}
在线程A释放锁之前将调用notify() (这将在return 11 ;语句之后“发生”)。 那么,正在等待此锁的线程B(通过wait()方法)如何获取仍由线程A持有的锁? 请注意,当通知线程B时,线程A尚未释放锁定。
所以我对这种情况的看法如下:
调用wait()之后 ,线程B将其状态从Running更改为Waiting 。 从线程A notify()方法接收到通知后,线程B将从wait()返回,将其状态更改为Runnable并尝试获取锁。 由于线程A尚未释放该锁,因此线程B将在对象的监视器上被阻止,并将其状态从Runnable传递给Blocked 。 最终,在线程A释放锁之后,线程B将获取该锁并将其状态从Blocked传递到Running 。
这是正确的吗? 我想用这个问题来理解的是,从已经被获取的锁同步的wait()返回的线程发生了什么 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.