Проблема Java - блокировки и условия с потоками - PullRequest
3 голосов
/ 05 апреля 2011

java.lang.IllegalMonitorStateException - это то, что я получаю с неприятной трассировкой стека.

final Condition[] threads = new Condition[maxThreads];
myclass()
{
for (int i =0; i<maxThreads; i++)
            threads[i] = mutex.newCondition();
}    
public void test()
{

mutex.lock();
   int id = threadCount;
   threadCount++;
mutex.unlock();
threads[id].await();
}

Когда я вызываю test с несколькими потоками, это выдает ошибку выше. Это вызвано линией ожидания. Я не решаюсь использовать синхронизированные, потому что я хочу, чтобы все потоки могли ждать.

Ответы [ 2 ]

3 голосов
/ 05 апреля 2011

На практике вы должны await как таковой:

mutex.lock();
try
{
    threads[threadCount++].await();
}
finally
{
    mutex.unlock();
}
3 голосов
/ 05 апреля 2011

Вы можете звонить только в ожидании, пока удерживаете блокировку мьютекса.Таким образом, код должен быть:

mutex.lock();
try {
   // do your stuff
   threads[id].await();
} finally {
   mutex.unlock();
}

Причина, по которой я добавил команду try / finally, заключается в том, чтобы гарантировать, что блокировка снята, даже если вы выдаваете исключение.

Вероятно, также стоит отметитьчто вы можете звонить signal только в ваших условиях, также удерживая блокировку на мьютексе.Вы можете получить блокировку мьютекса, даже если вы получили блокировку перед вызовом await, потому что вызов await заставляет ожидающий поток снять блокировку, пока он ждет.

...