那么这是否意味着两个线程不能同时调用 wait() ?
纠正两个线程不能同时调用wait()。但是,一旦一个线程处于 wait() 中,另一个线程可以获取相同的锁并在不久之后进入 wait() 状态。您可以在同一个对象上等待任意数量的线程,但只有一个真正持有锁。
这里的内在锁是什么意思[提到它作为监视器]?但是如何实现监控以实现互斥呢?
持有对象时只能运行一个线程。其他线程可能会阻塞尝试获取锁,并且可能会等待()更多线程。
一旦线程调用等待它会永远持有对象吗?
相反,它放弃它或另一个线程几乎可以立即获取它。
如果是这样,其他线程如何使用该锁进行 notifyAll()?
如果您在对象上调用 notifyAll(),则依次唤醒所有 wait() 线程。这些线程一次只能获取一个锁,并且会尽快重新获取锁。
如果我们需要在 notifyall 期间获取对象,那么为什么要通知所有等待的线程?
这就是 notifyAll 所做的,它被认为比使用 notify 更安全,后者会唤醒一个随机的,因为它不太容易出现编码错误。
它不应该单独通知等待该对象的线程吗?
这就是它的作用。
你应该注意到;
- 在您 notify()/notifyAll() 之前,您应该执行状态更改。您还应该在检查状态更改的循环内等待()。您需要这样做,因为 a) wait() 可能会错过 notify(),b) 它可能会虚假唤醒 c) 另一个线程可能会抓取您所做的任何事情,并且可能需要再次等待。
- 在过去的 9 年中,高级并发类的使用越来越多。使用这些类意味着您不需要直接使用线程、队列、wait() 和 notify()。