В Java, если несколько потоков ожидают() одно и то же условие A, тогда другой поток вызывает signalAll() при условииA, будут ли все очереди, ожидающие состояния, разблокироваться одновременно?В Java, будет ли несколько потоков ждать() одно и то же условие разблокируется в одно и то же время позже?
К примеру, у меня есть надстройка и способ удалить из очереди:
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();
}
}
Пусть нескольких потоков держать вызов добавить метод в общую очереди. Через некоторое время очередь заполнена. Все эти потоки застревают в spaceAvailableCondition.awati()
. Затем у меня есть этот поток, который вызывает метод remove, signalAll()
spaceAvailableCondition
. Будут ли все потоки, которые вызывают add, разблокировать и запустить метод, что приведет к повреждению в этой очереди?
Я задаю этот вопрос, потому что я думаю, что все другие «добавления потоков» внедрили queueLock.lock()
. Тогда вся нить имеет право владения этим замком.
Почему вы не попробуете его с помощью простой печати? – Bifz
@Bifz Потому что «дать ему попробовать» не подходит для рассуждений о параллелизме. – chrylis
Если вы поместили печать сразу после ожидания и сигнала вызова один раз, вы должны увидеть, сколько раз просыпалось. – Bifz