通知后跟另一个通知

时间:2013-04-03 17:05:32

标签: java multithreading locking notify

如果您通知锁定,并立即再次通知该锁定会怎样?假设有2个或更多线程在等待该锁。是否可以保证两个线程被唤醒?或者是否可能只唤醒一个线程,这意味着第二个通知已经过时了?

lock.notify();
lock.notify();

谢谢!

2 个答案:

答案 0 :(得分:5)

  

假设有2个或更多线程在等待该锁。是否可以保证两个线程被唤醒?

是。每个通知从等待队列中获取一个线程并将其放入阻塞队列 - 唤醒线程必须首先访问所讨论的synchronized锁。如果只有一个线程等待锁定,则第二个notify()将不执行任何操作。

重要的是要意识到线程将立即开始执行。由于它必须位于synchronized上的lock区块才能执行wait(),因此必须先获得lock的访问权限才能运行。块队列中可能还有多个其他线程,等待访问lock

答案 1 :(得分:0)

我怀疑这种行为与调用notifyAll()类似(在这种情况下,它更像是notifyTwo())

  

唤醒的线程将以通常的方式与可能正在竞争同步此对象的任何其他线程竞争;例如,被唤醒的线程在下一个锁定该对象的线程中没有可靠的特权或劣势。