首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java问题-带线程的锁和条件

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

Stack Overflow用户
提问于 2011-04-05 09:04:51
回答 2查看 325关注 0票数 3

java.lang.IllegalMonitorStateException是我通过一个讨厌的堆栈跟踪得到的。

代码语言:javascript
运行
复制
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时,它会生成上面的错误。这是由排队等候引起的。我不太愿意使用synchronized,因为我希望所有的线程都能等待。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-04-05 09:11:12

你只能在持有互斥锁的同时调用await。所以代码应该是:

代码语言:javascript
运行
复制
mutex.lock();
try {
   // do your stuff
   threads[id].await();
} finally {
   mutex.unlock();
}

我添加try / finally的原因是为了确保即使抛出异常,锁也会被释放。

可能还值得注意的是,您只能在保持互斥锁的同时,根据自己的条件调用signal。即使在调用await之前获得了锁,您也能够获得互斥锁,因为调用await会导致等待线程在等待时释放锁。

票数 3
EN

Stack Overflow用户

发布于 2011-04-05 09:13:42

在实践中,您应该这样await

代码语言:javascript
运行
复制
mutex.lock();
try
{
    threads[threadCount++].await();
}
finally
{
    mutex.unlock();
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5546057

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档