从Object.notifyAll 中唤醒并未能获得锁的线程在哪里?
where are the threads waken up from Object.notifyAll and failing to get the lock?
监视器的工作原理如下:
monitor
- 等待集中的线程在调用 Object.notifyAll() 时被唤醒。
- 其中只有一个获得了锁,而其他的又被阻塞了。
- 那么被阻塞的线程去哪里了?它们会回到等待集还是进入入口集?或者这是由 os 管理的,因为监视器依赖于 os MutexLock?
监视器是您应该了解的一个基本概念。最好在某个地方阅读它。
简而言之,我可以说有一些主要原则:
- 如果一个线程进入同步块 - 同步对象的监视器被阻塞,所有其他线程都不能
执行同步块(它们在条目集中)。
- 如果在同步对象上调用 wait() 方法,则线程进入 Wait Set
- 如果在同步对象上调用 notify()/notifyAll() 方法,则意味着 one/all 个线程从 Wait Set 转到 Entry Set。
你的问题的答案是 - 当你调用 notifyAll() 方法时,等待集中的所有线程都进入入口集。
监视器的工作原理如下: monitor
- 等待集中的线程在调用 Object.notifyAll() 时被唤醒。
- 其中只有一个获得了锁,而其他的又被阻塞了。
- 那么被阻塞的线程去哪里了?它们会回到等待集还是进入入口集?或者这是由 os 管理的,因为监视器依赖于 os MutexLock?
监视器是您应该了解的一个基本概念。最好在某个地方阅读它。
简而言之,我可以说有一些主要原则:
- 如果一个线程进入同步块 - 同步对象的监视器被阻塞,所有其他线程都不能 执行同步块(它们在条目集中)。
- 如果在同步对象上调用 wait() 方法,则线程进入 Wait Set
- 如果在同步对象上调用 notify()/notifyAll() 方法,则意味着 one/all 个线程从 Wait Set 转到 Entry Set。
你的问题的答案是 - 当你调用 notifyAll() 方法时,等待集中的所有线程都进入入口集。