gpt4 book ai didi

java - 在Java中,多个线程await()相同的条件会在稍后同时被解锁吗?

转载 作者:行者123 更新时间:2023-11-30 07:38:09 26 4
gpt4 key购买 nike

在Java中,如果多个线程await()同一个conditionA,然后另一个线程对conditionA调用signalAll(),所有等待conditionA的线程会同时解锁吗?

例如,我有一个队列的添加和删除方法:

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()。那么所有的线程都拥有这个锁的所有权。

最佳答案

不确定我是否理解你的问题。

虽然awaiting线程会被signalAll()唤醒,但只有其中一个能够重新获取锁(我假设是 >queueLock)与那些线程正在等待的spaceAvailableCondition相关联。因此,只有 1 个“添加”线程将执行逻辑。

关于java - 在Java中,多个线程await()相同的条件会在稍后同时被解锁吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35075470/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com