我觉得我已经知道那个问题的答案了,但我想读一下你们的看法,以确保我真正理解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;
}
}
在Thread A释放锁之前(即在“return 11”语句之后),将调用notify()。那么,等待此锁的线程B(通过wait()方法)如何获得仍由Thread A持有的锁呢?请注意,当线程B被通知时,Thread A尚未释放锁。
因此,我认为这种情况如下所示: 调用wait()后,Thread B将其状态从Running更改为Waiting。 收到来自Thread A notify()方法的通知后,Thread B将从wait()返回,将其状态更改为Runnable并尝试获取锁定。由于锁仍未被Thread A释放,因此Thread B将在对象的监视器上被阻止,并将其状态从Runnable更改为Blocked。 最终,在Thread A释放锁后,Thread B将获取锁并将其状态从Blocked更改为Running。
这样理解是正确的吗?我想通过这个问题了解一个经由已经获得的锁同步的wait()返回的线程会发生什么。
return
语句本身并不释放锁。如果return
语句出现在synchronized
块或方法中,那么实际上是由于离开该块或方法而导致锁被释放。 - Sotirios Delimanolis