等待,从同步的上下文中通知方法

时间:2011-11-20 04:53:45

标签: java

我知道这是一个重复的问题。但我无法通过解释理解。 我想通过一个很好的例子来理解它。请任何人帮忙。

“为什么我们从同步的上下文中调用wait(),notify()方法”。

2 个答案:

答案 0 :(得分:0)

当我们在线程中使用synchronize时,这意味着我们确实对该对象进行了锁定,并且该对象一次只能由一个线程使用,以避免各种并发问题。

wait()和notify()方法仅用于同步上下文。

wait方法暂停当前线程的工作并释放它在任何对象上持有的锁,以便其他线程可以使用该同步对象。

当其他线程完成其工作时,它会调用notify方法,这会导致第一个线程再次获取对象的锁定并恢复其工作。

您可以轻松地从网上获取示例。

答案 1 :(得分:0)

我们主要使用wait()和notify()或notifyAll()方法进行线程间通信。

检查条件后,一个线程正在等待,例如在Producer Consumer示例中,如果缓冲区已满,则生产者线程正在等待,并且消费者线程通过使用元素在缓冲区中创建空间后通知生产者线程。调用notify()或notifyAll()向单个或多个线程发出通知条件已更改的通知,并且一旦通知线程离开synchronized块,所有正在等待的对象锁定它们正在等待的对象锁定并且幸运线程从重新获取锁后再继续进行wait()方法。让我们逐步划分整个操作以查看Java中wait()和notify()方法之间的竞争条件的可能性,我们将使用Produce Consumer线程示例来更好地理解场景:

  1. Producer线程测试条件(缓冲区是否已满)并确认它必须等待(找到缓冲区已满)。
  2. Consumer线程在使用缓冲区中的元素后设置条件。
  3. Consumer线程调用notify()方法;由于Producer线程还没有等待,这听起来闻所未闻。
  4. Producer线程调用wait()方法并进入等待状态。
  5. 因此,由于竞争条件,我们可能会丢失通知,如果我们使用缓冲区或只使用一个元素,则生产线程将永远等待,您的程序将挂起。总之,为了避免竞争条件,从同步的上下文中调用wait(),notify()和notifyAll()。

    HTH。