java.util.concurrent.CompletionException: java.lang.IllegalMonitorStateException: attempt to unlock

今天工作的时候出现了一个错误

java.util.concurrent.CompletionException: java.lang.IllegalMonitorStateException: attempt to unlock lock, not locked by current thread by node id

这个报错的原因,找了一下,发现是线程A的锁,但是线程B去尝试释放锁,导致出现了这个报错

正常的释放锁的时候我添加了两个判断的方法

lock.isLocked();//检验该锁是否被线程使用,如果被使用返回True
lock.isHeldByCurrentThread()//检查当前线程是否获得此锁(这个和上面的区别就是该方法可以判断是否当前线程获得此锁,而不是此锁是否被线程占有)
//这个比上面那个实用

正常来说,A线程的锁应该不可能再会被B线程释放了,可是我这里就是出现了这种情况。

解决方法:
我在方法刚开始的地方添加了获取线程ID的内容

String threadId = String.valueOf(Thread.currentThread().getId());

获取到了以后,在释放锁的时候,再次得到此线程的ID,判断他与我们之前获取的线程ID的值是否一致,如果一致,才可以进行锁的释放

if (lock.isLocked() && lock.isHeldByCurrentThread() && Objects.equals(threadId, String.valueOf(Thread.currentThread().getId()))) {
                                lock.unlock();
                            }

通过这个方法,已经不会再报之前的错误了,可能我这种方法比较笨,但是暂时解决了我面临的问题,如果小伙伴有更好的方法,希望可以学习,也希望这篇帖子可以帮助到与我面临一样问题的小伙伴们。

上一篇:Linux文件查找的命令


下一篇:Appium自动化(7) - HardwareActions 类里的方法