首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >java:如果在锁释放之前总是调用(),那么等待的线程如何获得相同的锁?

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

Stack Overflow用户
提问于 2014-11-02 16:53:33
回答 1查看 1.3K关注 0票数 9

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

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

代码语言:javascript
运行
复制
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 ()返回的线程发生了什么情况,该线程由已经获得的锁同步。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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块时所具有的完全相同的行为。到达的第一个线程将锁定对象监视器,立即完成锁定对象。其他线程阻塞直到它的锁操作完成,即。在第一个线程解锁监视器之后。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26701869

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档