【发布时间】:2013-04-03 17:05:32
【问题描述】:
如果您通知一个锁,然后立即再次通知该锁,会发生什么?假设有 2 个或更多线程在等待该锁。是否保证两个线程被唤醒?或者是否有可能只唤醒了一个线程,这意味着第二个通知已经过时了?
lock.notify();
lock.notify();
谢谢!
【问题讨论】:
标签: java multithreading locking notify
如果您通知一个锁,然后立即再次通知该锁,会发生什么?假设有 2 个或更多线程在等待该锁。是否保证两个线程被唤醒?或者是否有可能只唤醒了一个线程,这意味着第二个通知已经过时了?
lock.notify();
lock.notify();
谢谢!
【问题讨论】:
标签: java multithreading locking notify
假设有 2 个或更多线程在等待该锁。是否保证两个线程都被唤醒?
是的。每个通知从等待队列中取出一个线程并将其放入阻塞队列中——被唤醒的线程必须首先访问有问题的synchronized 锁。如果只有 1 个线程在等待锁,那么第二个 notify() 将什么也不做。
重要的是要意识到线程不会立即开始执行。因为它必须在lock 上的synchronized 块中才能执行wait(),它必须再次访问lock 才能运行。块队列中可能已经有多个其他线程,等待访问lock。
【讨论】:
notify 是native。你怎么能确定这是行为?为什么不例如第二个notify 不做任何事情,因为notify 带有当前的锁定范围是否已经提升?
Object.notify() 有一个与本机实现无关的规范。
notify 实现“知道”notify 已经被调用所以它什么都不做?
notify() 会在等待时释放少于 2 个线程。
我怀疑这种行为类似于调用 notifyAll()(在这种情况下,它更像是 notifyTwo())
被唤醒的线程将以通常的方式与任何其他可能正在积极竞争以同步此对象的线程进行竞争;例如,被唤醒的线程在成为下一个锁定该对象的线程时不享有可靠的特权或劣势。
【讨论】: