gpt4 book ai didi

java - 如果线程在同步块(synchronized block)之前等待监视器被释放或者它调用 wait() 有什么区别

转载 作者:搜寻专家 更新时间:2023-11-01 01:09:20 25 4
gpt4 key购买 nike

我读过很多关于线程状态的文档,其中一些说有两种不同的状态:阻塞(在同步之前)和等待(如果调用等待),另一些说只有一种状态:WAITING。此外,一些文档告诉您应该为每个 wait() 调用 notify() ,如果您不这样做,那么线程 waiting() 将永远无法执行,即使监视器已解锁。

最佳答案

从你最后一句话我看出你没有完全理解 synchronizedwait()/notify() 之间的区别。

基本上,monitor 有lockcondition。这几乎是正交的概念。

  • 当线程进入一个synchronized block 时,它会获得一个锁。当线程离开该 block 时,它会释放一个锁。只有一个线程可以锁定特定监视器。

  • 当有锁的线程调用wait()时,它会释放锁并开始等待它的条件。当具有锁的线程调用 notify() 时,等待条件的线程之一(在 notifyAll() 的情况下为所有线程)有资格执行(并开始等待获取锁,因为通知线程仍然拥有它)。

因此,等待获取锁(Thread.State.BLOCKED)和等待监视器的条件(Thread.State.WAITING)是不同的独立状态。

如果您查看 Lock,此行为会变得更加清晰类 - 它实现了与 synchronized block 相同的同步原语(带有一些扩展),但在锁和条件之间提供了明确的区分。

关于java - 如果线程在同步块(synchronized block)之前等待监视器被释放或者它调用 wait() 有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3872606/

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