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时,它会生成上面的错误。它是由await线引起的。我对使用synchronized犹豫不决,因为我希望所有线程都可以等待。
答案 0 :(得分:3)
您只能在持有互斥锁的时候呼叫等待。所以代码应该是:
mutex.lock();
try {
// do your stuff
threads[id].await();
} finally {
mutex.unlock();
}
我添加try / finally的原因是为了确保即使你抛出异常也会释放锁。
可能还值得注意的是,您只能在锁定互斥锁的同时调用signal
条件。你可以锁定互斥锁,即使你在调用await之前有一个锁,因为调用await
会导致等待的线程在等待时释放它的锁。
答案 1 :(得分:3)
在实践中,你应await
这样:
mutex.lock();
try
{
threads[threadCount++].await();
}
finally
{
mutex.unlock();
}