繁体   English   中英

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

[英]wait,notify methods from a synchronized context

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

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

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

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

  1. Producer线程测试条件(缓冲区是否已满)并确认它必须等待(找到缓冲区已满)。
  2. Consumer线程在使用缓冲区中的元素后设置条件。
  3. Consumer线程调用notify()方法; 这是闻所未闻的,因为Producer线程还没有等待。
  4. Producer线程调用wait()方法并进入等待状态。

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

HTH。

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM