Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 等等,从同步上下文通知方法_Java - Fatal编程技术网

Java 等等,从同步上下文通知方法

Java 等等,从同步上下文通知方法,java,Java,我知道这是一个重复的问题。但我无法理解的解释。 我想用一个很好的例子来清楚地理解它。谁能帮忙吗 “为什么我们从同步上下文调用wait(),notify()方法”。当我们在线程中使用同步时,这意味着我们对该对象进行了锁定,并且该对象一次只能由一个线程使用,以避免各种并发问题 wait()和notify()方法仅在同步上下文中使用 wait方法暂停当前线程的工作,并释放它在任何对象上持有的锁,以便其他线程可以使用该同步对象 当其他线程完成其工作时,它调用notify方法,该方法使第一个线程再次获得对

我知道这是一个重复的问题。但我无法理解的解释。 我想用一个很好的例子来清楚地理解它。谁能帮忙吗


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

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

wait()和notify()方法仅在同步上下文中使用

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

当其他线程完成其工作时,它调用notify方法,该方法使第一个线程再次获得对象的锁并恢复其工作

您可以很容易地从网络上获得示例。

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

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

  • 生产者线程测试条件(缓冲区是否已满),并确认它必须等待(在找到缓冲区已满之后)
  • 使用者线程在使用缓冲区中的元素后设置条件
  • 使用者线程调用notify()方法;这是前所未闻的,因为生产者线程尚未等待
  • 生产者线程调用wait()方法并进入等待状态
  • 所以,由于这里的竞争条件,我们可能会丢失一个通知,如果我们使用缓冲区或仅一个元素,则生成线程将永远等待,并且您的程序将挂起。总之,为了避免竞争条件,从同步上下文调用wait()、notify()和notifyAll()


    HTH.

    如果您不想同步,等待并通知并不意味着什么。如果你不使用它们来同步,它们是无效的。我知道,先生。但我想问的是,从同步上下文中调用它们的原因是什么。此项是重复项,可以在此处得到充分回答:或者您可以提供此链接-