我想我已经知道这个问题的答案了,但是,我想读一下您的意见,以确保我真正理解java线程的状态机(或图表)是如何工作的。
假设线程A在返回给定值之前运行():
public class baz{
// Thread B runs this:
public synchronized void bar(){
wait();
}
// Thread A runs this:
public synchronized int foo(){
notify();
return 11;
}
}
在线程A释放锁(将发生在“返回11;语句”之后)之前,将调用notify()。那么,等待此锁的线程B (通过wait()方法)如何获得线程A仍然持有的锁呢?注意,当线程B被通知时,线程A还没有释放锁。
因此,我认为这种情况如下:
调用wait()之后,线程B将将其状态从运行的更改为wait。在收到通知(来自线程A、、notification ()方法)之后,线程B将从wait()返回,将其状态更改为Runnable并尝试获取锁。由于线程A尚未释放锁,线程B将在对象的监视器上被阻塞,并将其状态从运行的传递给阻塞的。最终,在线程A释放锁后,线程B将获取锁并将其状态从阻止的传递给运行的。
是这样的吗?关于这个问题,我想了解的是,从 What ()返回的线程发生了什么情况,该线程由已经获得的锁同步。
发布于 2014-11-02 16:58:34
是的,你的解释是正确的。
当在对象上调用wait()
时,调用线程将被添加到对象的http://docs.oracle.com/javase/specs/jls/se8/html/jls-17.html#jls-17.2中。当它是notify()
ied时,它将从等待集中移除,并对对象执行锁定动作 (该对象在synchronized
块内)。该锁操作将阻止当前线程,直到它完成为止。锁定了对象监视器。
这是两个线程在试图在同一个对象上输入synchronized
块时所具有的完全相同的行为。到达的第一个线程将锁定对象监视器,立即完成锁定对象。其他线程阻塞直到它的锁操作完成,即。在第一个线程解锁监视器之后。
https://stackoverflow.com/questions/26701869
复制相似问题