为什么我们需要mutex进行等待通知

时间:2017-12-14 21:18:34

标签: java multithreading

我开始更深入地研究多线程,我不太清楚我理解为什么在使用wait / notify机制时需要添加 synchronized 关键字。 有人可以解释一下吗?

1 个答案:

答案 0 :(得分:1)

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