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

问题描述:

我知道这是一个重复的问题。但我无法理解的解释。 我想通过一个很好的例子来清楚地理解它。任何人都可以帮忙。等待,从同步的上下文中通知方法

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

+0

任何人都可以请回答。 – aj983

+0

如果您不想寻找同步,等待并通知并不意味着什么。如果你不使用它们进行同步,它们是无效的。 – ben

+0

我知道那位先生。但我在问什么是从同步上下文中调用它们的原因。 – aj983

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

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

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

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

你可以很容易地从网上获得例子。

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

一个线程在检查条件后正在等待,例如在生产者消费者示例生产者线程正在等待缓冲区已满并且消费者线程通过消费元素在缓冲区中创建空间之后通知生产者线程。调用notify()或notifyAll()向单个或多个线程发出条件已更改的通知,并且一旦通知线程离开synchronized块,正在等待的所有线程都会争夺它们正在等待的对象锁定,并且幸运线程返回wait()方法重新获取锁后继续。让我们分裂步骤这整个操作看的等待(之间的竞争条件的可能性)和notify()方法在Java中,我们将使用生产的消费线程的例子来理解的情况下更好地:

  1. 生产者线程测试条件(缓冲区已满或未满)并确认它必须等待(查找缓冲区已满)。
  2. Consumer线程在从缓冲区中消耗一个元素后设置条件。
  3. Consumer线程调用notify()方法;这是闻所未闻的,因为生产者线程尚未等待。
  4. 生产者线程调用wait()方法并进入等待状态。

因此,由于竞争条件,我们可能会失去通知,如果我们使用缓冲区或只有一个元素产生线程将永远等待,您的程序将挂起。总之,为了避免竞争条件,wait(),notify()和notifyAll()被从同步的上下文中调用。

HTH。

+0

或者你可以给这个链接 - http ://javarevisited.blogspot。COM/2011/05 /等待通知-和notifyAll的功能于java.html – Anshu