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

时间:2011-04-05 01:04:51

标签: java monitor

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

2 个答案:

答案 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();
}