当前位置: 首页 > 知识库问答 >
问题:

在ReentrantLock上解锁,无非法监视器状态异常

宗政松
2023-03-14

我有一段代码(简化):

if(reentrantLockObject.isLocked()) {
       reentrantLockObject.unlock();
}

其中reentrantLockObject是java。util。同时发生的锁。可重入锁定。有时我会得到非法的监控。在check和unlock()调用之间释放了锁。如何防止这种异常?

共有3个答案

龚盛
2023-03-14

ReentrantLock根据以下逻辑引发此异常:

if (Thread.currentThread() != getExclusiveOwnerThread()) {
  throw new IllegalMonitorStateException();
}

所以解决方法是检查同一个线程是否正在解锁:

if (reentrantLockObject.isHeldByCurrentThread()) {
  reentrantLockObject.unlock();
}
袁炳
2023-03-14

只有当某个线程拥有锁时,你才需要拥有锁才能解锁它。reenter antLockObject.isLocked()只有在某个线程拥有锁时才是真的,而不一定是你。

  reentrantLockObject.lock();
  try{

       // do stuff
  }finally{
         reentrantLockObject.unlock();
  }

在这里,线程拥有锁,因此他们能够解锁它。

胡高朗
2023-03-14

isLocked返回是否有线程持有锁。我想你想要isHeldByCurrentThread

if (reentrantLockObject.isHeldByCurrentThread()) {
    reentrantLockObject.unlock();
}

话虽如此,isHeldByCurrentThread被记录下来主要用于诊断目的——这段代码是正确的方法是不寻常的。你能解释一下为什么你认为你需要它吗?

 类似资料:
  • 问题内容: 如何将轮询线程传递给另一个线程进行处理。程序执行在具有主方法和线程池的控制器类中: 主类控制器 具有轮询类的线程的方法 具有proc类的线程的方法 轮询类和控制器类 我的任务和问题是: 1.控制器应同时处理轮询器和处理器线程,并且应仅调用轮询器和处理器线程 2.现在我的问题是如何使轮询线程等待3秒并并行通知处理器。 我得到如下错误: 这里如何实现异步处理? 问题答案: 你需要阅读的东西

  • 我正在尝试实现线程,其中一个线程生成随机数,而另一个线程等待,一旦它生成随机数,它应该通知并等待另一个线程也这样做。我收到了非法的监控状态异常,请帮我指出我的错误。

  • 本文向大家介绍ReentrantLock源码详解--公平锁、非公平锁,包括了ReentrantLock源码详解--公平锁、非公平锁的使用技巧和注意事项,需要的朋友参考一下 问题 (1)重入锁是什么? (2)ReentrantLock如何实现重入锁? (3)ReentrantLock为什么默认是非公平模式? (4)ReentrantLock除了可重入还有哪些特性? 简介 Reentrant = Re

  • 在Java尝试使用一个简单的计数器来实践生产者和消费者。不知道为什么我会在这段代码上得到一个非法的监视器状态异常。 我有计数器rest和计数器Consumer方法,它们在自己的线程中运行。计数器本身是一个静态的int volatile字段。counter类还为您提供了一个锁 如果将wait naotify更改为: 代码起作用了。dosen't wait()和notify()自动获得锁synchro

  • 异常跟踪: “”java.lang.IllegalStateException:在org.apache.catalina.core.applicationDispatcher.doForward(applicationDispatcher.java:328)在org.apache.catalina.core.applicationDispatcher.doForward(applicationDi

  • 我正在尝试使用下面的快速加载API 连接…等是完美的。 我确切地知道它在哪里失败 例外情况是 < code >线程“main”Java . lang . illegalstateexception中出现异常:示例失败。 这是我试图上传的表格。它是格式,当我通过记事本打开它时,它看起来像这样 为什么我会得到这个异常?我该如何改进?据我理解问题是< code > pstmtfld . setascii