【发布时间】:2018-05-29 01:35:09
【问题描述】:
我已经开始更深入地研究多线程,但我不太确定我是否理解如果我使用等待/通知机制,我为什么需要添加 synchronized 关键字。 谁能解释一下?
【问题讨论】:
标签: java multithreading
我已经开始更深入地研究多线程,但我不太确定我是否理解如果我使用等待/通知机制,我为什么需要添加 synchronized 关键字。 谁能解释一下?
【问题讨论】:
标签: java multithreading
例如,一个线程从缓冲区读取数据,一个线程将数据写入缓冲区。读数据线程需要等待,直到写数据线程将一个块数据完全写入缓冲区。写入数据线程需要等待,直到读取数据线程完全从缓冲区中读取数据。如果可以通过普通方法调用 wait() 和 notify() 方法,则读取线程调用 wait() 并将线程添加到等待队列中。就在同一时刻,编写线程调用 notify() 来发出条件变化的信号。读取线程错过了更改并永远等待。因此,由于这里的竞争条件,我们可能会丢失通知,如果我们使用缓冲区或只有一个线程将永远等待并且程序将挂起。由于 Java 中的 wait() 方法也在等待之前释放锁,并在从 wait() 方法返回之前重新获取锁,所以我们必须使用这个锁来确保检查条件(缓冲区是否已满)并设置条件(从缓冲区获取元素)是原子的,可以通过使用 Java 中的同步方法或块来实现。因此,它们必须在互斥的同步方法或块中调用(互斥)。
【讨论】: