【问题标题】:Why do we need mutex for wait notify [duplicate]为什么我们需要互斥锁来等待通知[重复]
【发布时间】:2018-05-29 01:35:09
【问题描述】:

我已经开始更深入地研究多线程,但我不太确定我是否理解如果我使用等待/通知机制,我为什么需要添加 synchronized 关键字。 谁能解释一下?

【问题讨论】:

    标签: java multithreading


    【解决方案1】:

    例如,一个线程从缓冲区读取数据,一个线程将数据写入缓冲区。读数据线程需要等待,直到写数据线程将一个块数据完全写入缓冲区。写入数据线程需要等待,直到读取数据线程完全从缓冲区中读取数据。如果可以通过普通方法调用 wait() 和 notify() 方法,则读取线程调用 wait() 并将线程添加到等待队列中。就在同一时刻,编写线程调用 notify() 来发出条件变化的信号。读取线程错过了更改并永远等待。因此,由于这里的竞争条件,我们可能会丢失通知,如果我们使用缓冲区或只有一个线程将永远等待并且程序将挂起。由于 Java 中的 wait() 方法也在等待之前释放锁,并在从 wait() 方法返回之前重新获取锁,所以我们必须使用这个锁来确保检查条件(缓冲区是否已满)并设置条件(从缓冲区获取元素)是原子的,可以通过使用 Java 中的同步方法或块来实现。因此,它们必须在互斥的同步方法或块中调用(互斥)。

    【讨论】:

    • 感谢您的回答。你能解释一下什么是等待队列吗?如果例如多个线程在同一个对象上调用等待,释放锁是否有任何顺序
    • 如果你引用一些文章至少指出出处,比如:xyzws.com/javafaq/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-15
    • 2010-12-07
    • 1970-01-01
    • 2021-09-01
    • 1970-01-01
    • 2019-11-24
    相关资源
    最近更新 更多