如果您通知一个锁,然后立即再次通知该锁,会发生什么?假设有 2 个或更多线程在等待该锁。是否保证两个线程被唤醒?或者是否有可能只有一个线程被唤醒,这意味着第二个通知变得过时了?
lock.notify();
lock.notify();
谢谢!
如果您通知一个锁,然后立即再次通知该锁,会发生什么?假设有 2 个或更多线程在等待该锁。是否保证两个线程被唤醒?或者是否有可能只有一个线程被唤醒,这意味着第二个通知变得过时了?
lock.notify();
lock.notify();
谢谢!
假设有 2 个或更多线程在等待该锁。是否保证两个线程被唤醒?
是的。每个通知从等待队列中取出一个线程并将其放入阻塞队列中——被唤醒的线程必须首先获得对相关synchronized
锁的访问权。如果只有 1 个线程在锁上等待,那么第二个线程notify()
什么也不做。
重要的是要意识到线程不会立即开始执行。由于它必须在一个synchronized
块中lock
才能执行它,所以它必须在它可以运行之前wait()
访问另一个。lock
块队列中可能已经有多个其他线程,等待访问lock
.
我怀疑这种行为类似于调用 notifyAll()(在这种情况下,它更像是 notifyTwo())
被唤醒的线程将以通常的方式与可能正在积极竞争以在该对象上同步的任何其他线程竞争;例如,被唤醒的线程在成为下一个锁定该对象的线程时不享有可靠的特权或劣势。