Java 同步闭塞后

Java 同步闭塞后,java,multithreading,synchronized,Java,Multithreading,Synchronized,当在多线程中工作时,Java中的同步块是一个很好的特性,这是非常常见的。我知道它们的大部分工作原理,但我想更确切地知道它们与等待和通知(All)相结合时的工作原理 通常,当一个线程进入同步块时,在第一个线程离开之前,其他线程不能进入该块。但是,在对同步对象调用wait时,情况并非如此。如果是这样,另一个线程将无法调用notify(All),这需要在调用对象之前与该对象同步 那么,等待调用是否会使调用退出同步?或者,如果java在另一个块中发现notify(All),它是否会产生异常?另外,当从一

当在多线程中工作时,Java中的同步块是一个很好的特性,这是非常常见的。我知道它们的大部分工作原理,但我想更确切地知道它们与等待和通知(All)相结合时的工作原理

通常,当一个线程进入同步块时,在第一个线程离开之前,其他线程不能进入该块。但是,在对同步对象调用wait时,情况并非如此。如果是这样,另一个线程将无法调用notify(All),这需要在调用对象之前与该对象同步

那么,等待调用是否会使调用退出同步?或者,如果java在另一个块中发现notify(All),它是否会产生异常?另外,当从一个同步块调用wait,然后从另一个块调用notify(All)时,一个线程是否在继续之前等待另一个线程完成,如果是,是哪一个

现在我可以设置一个快速测试来回答我所知道的大部分问题。但它不会回答更技术性的问题,我相信在座的人可以回答。我不仅对什么和什么时候感兴趣,而且对为什么感兴趣。尝试搜索一些记录的信息,但找不到任何关于等待/通知(全部)的有用信息

编辑:

如果其他人感兴趣,这是测试结果。如果我们有Thread1、Thread2和Thread3,其中前两个等待释放,第三个等待释放,顺序如下

  • Thread1进入并调用wait()
  • Thread2进入并调用wait()
  • Thread3输入并调用notifyAll()
  • 始终使用螺纹3饰面
  • 但是,等待线程没有特定的顺序。哪个先执行,完全是随机的,与调用wait()的顺序无关。然而,调用notify(All)的线程总是在任何等待的线程继续之前完成
    是的,它有点特别
    wait
    释放
    同步块中获取的
    ,并挂起它的
    线程
    (获取锁的线程),这意味着将允许其他线程获取锁并修改状态。
    现在notify或notifyAll将唤醒处于休眠状态的线程,它们将重新获取

    是的,它有点特别
    wait
    释放
    同步块中获取的
    ,并挂起它的
    线程
    (获取锁的线程),这意味着将允许其他线程获取锁并修改状态。
    现在notify或notifyAll将唤醒处于休眠状态的线程,它们将重新获取

    等待是针对在另一个线程将其踢出之前不想执行的守护进程线程。等待是针对任何因任何原因需要等待另一个线程的线程。问题不在于等待什么,而在于它们在技术上如何工作。Java如何处理它们。调用wait是否会使调用退出同步?对线程在
    wait()
    调用中释放锁,然后在
    wait()
    返回之前重新获取锁。wait用于在另一个线程将其踢出之前不想执行的守护进程线程。wait用于任何因任何原因需要等待另一个线程的线程。问题不在于等待什么,而在于它们在技术上如何工作。Java如何处理它们。调用wait是否会使调用退出同步?对线程在
    wait()
    调用中释放锁,然后在
    wait()
    返回之前重新获取锁。好的,如果等待的线程在从等待中释放锁时重新获取锁,那么此时调用notify(All)的线程将在同步对象上拥有锁,因为notify(All)需要位于同步块内。这意味着调用notify(All)的线程将在等待的线程继续之前完成?@DanielB记住,在关键部分,一次只能调用一个线程。notifyAll将从文档中重新获取它已放弃的锁:“在当前线程放弃此对象上的锁之前,唤醒的线程将无法继续”谢谢,这很有帮助。但是最好设置一个小测试,以确保我知道执行所有操作的确切顺序。@DanielB,是的,调用
    notify()
    notifyAll()
    的线程必须在
    wait()
    调用返回之前离开
    synchronized
    块。这是一个经过深思熟虑的设计决策。等待/通知机制旨在以非常具体的方式使用。是的,我希望它是这样的,但是如果等待线程也会以某种顺序执行,我会希望这样。好的,如果等待线程在从等待中释放时重新获得锁,那么此时调用notify(All)的线程将已经在同步对象上拥有锁,因为notify(All)需要位于同步块内。这意味着调用notify(All)的线程将在等待的线程继续之前完成?@DanielB记住,在关键部分,一次只能调用一个线程。notifyAll将从文档中重新获取它已放弃的锁:“在当前线程放弃此对象上的锁之前,唤醒的线程将无法继续”谢谢,这很有帮助。但是最好设置一个小测试,以确保我知道执行所有操作的确切顺序。@DanielB,是的,调用
    notify()
    notifyAll()
    的线程必须在
    wait()
    调用返回之前离开
    synchronized
    块。这是一个经过深思熟虑的设计决策。等待/通知机制旨在以非常具体的方式使用。是的,我希望会是这样,但我会