在Java中,多个线程等待()相同的条件会在以后同时解锁吗?

在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)

在Java中,如果多个线程等待()相同的conditionA,那么另一个线程调用conditionA上的signalAll(),那么等待conditionA的所有线程会同时解锁吗

例如,我有一个队列的add和remove方法:

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,因为“尝试一下”不是一种合适的并发推理方法。如果在等待和调用信号一次之后立即打印,然后你应该看到有多少人醒了过来。而重新获得锁的人是具有最高优先级的人。对吗?我无法从记忆中回忆起线程优先级与唤醒顺序(因此能够获得锁)有任何关系。我认为这取决于执行情况