在Java中,多个线程等待()相同的条件会在以后同时解锁吗?
在Java中,如果多个线程等待()相同的conditionA,那么另一个线程调用conditionA上的signalAll(),那么等待conditionA的所有线程会同时解锁吗 例如,我有一个队列的add和remove方法:在Java中,多个线程等待()相同的条件会在以后同时解锁吗?,java,multithreading,Java,Multithreading,在Java中,如果多个线程等待()相同的conditionA,那么另一个线程调用conditionA上的signalAll(),那么等待conditionA的所有线程会同时解锁吗 例如,我有一个队列的add和remove方法: public void add(E newValue) throws InterruptedException { queueLock.lock(); try { while (size == elements.length)
public void add(E newValue) throws InterruptedException
{
queueLock.lock();
try
{
while (size == elements.length)
spaceAvailableCondition.await();
elements[tail] = newValue;
tail++;
size++;
if (tail == elements.length)
tail = 0;
valueAvailableCondition.signalAll();
}
finally
{
queueLock.unlock();
}
}
public E remove() throws InterruptedException
{
queueLock.lock();
try
{
while (size == 0)
valueAvailableCondition.await();
E r = (E) elements[head];
head++;
size--;
if (head == elements.length)
head = 0;
spaceAvailableCondition.signalAll();
return r;
}
finally
{
queueLock.unlock();
}
}
假设多个线程一直在共享队列上调用add方法。过了一会儿,队列就满了。所有这些线程都卡在spaceAvailableCondition.awati()
上。然后,我有一个线程调用方法remove,signalAll()
spaceAvailableCondition。调用add的所有线程是否都将解锁并运行该方法,这将导致该队列上的损坏
我问这个问题是因为我认为所有其他“添加线程”都实现了
queueLock.lock()
。那么所有线程都拥有这个锁的所有权。不确定我是否正确理解你的问题
虽然
waiting
ing线程将被signalAll()
唤醒,但其中只有一个线程能够重新获取与那些线程正在等待的spaceAvailableCondition
相关联的锁(我假设是queueLock
)。因此,只有1个“add”线程将执行逻辑。假设spaceAvailableCondition
是从queueLock
获取的条件变量,则不,它们不会“同时”唤醒
您已经知道,不允许从未锁定queueLock
的线程调用spaceAvailableCondition()
。这是因为,spaceAvailableCondition.await()调用执行以下操作:
它释放队列锁
queueLock
一次只能有一个线程拥有
queueLock
,因此当发出条件信号时,只有一个线程能够立即从wait()
调用返回。下一个线程将无法获取锁并从await()
返回,直到第一个线程释放锁,依此类推。为什么不使用简单的打印来尝试它?@Bifz,因为“尝试一下”不是一种合适的并发推理方法。如果在等待和调用信号一次之后立即打印,然后你应该看到有多少人醒了过来。而重新获得锁的人是具有最高优先级的人。对吗?我无法从记忆中回忆起线程优先级与唤醒顺序(因此能够获得锁)有任何关系。我认为这取决于执行情况