gpt4 book ai didi

java - 同步块(synchronized block)后面

转载 作者:太空宇宙 更新时间:2023-11-04 13:12:50 25 4
gpt4 key购买 nike

在多线程中工作时,Java 中的同步块(synchronized block)是一个很棒的功能,这种情况很常见。我知道它们的大部分工作原理,但想更确定它们与 wait 和 notification(All) 结合使用时的工作原理。

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

那么 wait 调用是否会使调用脱离同步?或者如果java在不同的 block 中发现notify(All),它是否会抛出异常?另外,当从一个同步块(synchronized block)调用 wait,然后从另一个同步块(synchronized block)调用 wait(All) 时,一个线程是否会等待另一个线程完成后再继续,如果是,是哪一个线程?

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

编辑:

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

  1. Thread1 进入并调用 wait()
  2. Thread2 进入并调用 wait()
  3. Thread3进入并调用notifyAll()
  4. 线程 3 始终完成
  5. 但是等待线程没有特定的顺序。哪一个先执行,完全是随机的,与调用 wait() 的顺序无关。然而,调用notify(All)的线程总是会在任何等待线程继续之前完成。

最佳答案

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

关于java - 同步块(synchronized block)后面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33801573/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com