Java问题 – 带线程的锁和条件

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犹豫不决,因为我希望所有线程都能够等待.

最佳答案
您只能在挂锁互斥锁的同时呼叫等待.所以代码应该是:

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

我添加try / finally的原因是确保即使抛出异常也会释放锁.

可能还值得注意的是,您只能在锁定互斥锁的同时调用您的条件信号.你可以锁定互斥锁,即使你在调用await之前有一个锁,因为调用await导致等待的线程在等待时释放它的锁.

转载注明原文:Java问题 – 带线程的锁和条件 - 代码日志