如果您通知一个锁,然后立即再次通知该锁,会发生什么情况?假设有2个或更多的线程在等待该锁。能保证唤醒两个线程吗?或者可能只有一个线程被唤醒,这意味着第二个通知变得过时?
lock.notify();
lock.notify();谢谢!
发布于 2013-04-04 01:08:22
假设有2个或更多线程在等待该锁。能保证唤醒两个线程吗?
是。每个notify从等待队列中获取一个线程,并将其放入阻塞队列中--被唤醒的线程必须首先访问相关的synchronized锁。如果只有一个线程在等待锁,那么第二个notify()将不会执行任何操作。
重要的是要认识到线程不会立即开始执行。因为它必须在lock上的synchronized块中才能执行wait(),所以它必须再次访问lock才能运行。可能已有多个其他线程在阻塞队列中,等待访问lock。
发布于 2013-04-04 01:12:55
我怀疑其行为类似于调用notifyAll() (在本例中,它更像是notifyTwo())
被唤醒的线程将以通常的方式与可能正在积极竞争同步此对象的任何其他线程竞争;例如,被唤醒的线程在成为锁定此对象的下一个线程方面没有任何可靠的特权或劣势。
https://stackoverflow.com/questions/15793667
复制相似问题