我正在尝试创建一个基础架构,其中不同的机器通过Redisson获取共享锁。一旦锁定被获取,一些异步任务就完成了,最后,当我完成工作时,我通过当前运行的线程释放Redisson锁 - 但是我收到以下错误
java.lang.IllegalMonitorStateException: attempt to unlock lock, not locked by current thread by node id: xxxxx thread-id: 57
所以,我理解它的含义,但由于我想执行异步工作,我不能使用获取线程来执行发布。
我不应该使用Redisson锁吗?像这样的异步工作的最佳匹配是什么?
答案 0 :(得分:3)
正如zapl所提到的,Java documentation表明这是java锁的正确行为。 在讨论Reddison's GitHub page上的问题之后,似乎Redisson Lock不是为此而设计的,并且Redisson Semaphore将很快支持异步操作。
与此同时,我计划分配一个线程来执行所有锁定和解锁。由于Redisson支持异步,非阻塞调用,因此此解决方案现在似乎是合理的。
答案 1 :(得分:1)
我建议使用Redisson Semaphore对象。从2.2.14版本开始,它通过done
接口支持异步操作。
答案 2 :(得分:0)
由于您的服务正在多个节点上运行。建议您在解锁之前使用lock.isHeldByCurrentThread()方法。一个示例方法想要
RLock lock = redissonClient().getLock(lockLabel);
try {
if (lock.tryLock(lockAcquireWaitTime, lockLeaseTime, TimeUnit.MINUTES)) {
//Action to be performed when lock is acquired.
lock.unlock();
}
Thread.sleep(syncMonitorInterval);
} catch (Exception e) {
LOG.error("Error..", e);
} finally {
if (lock != null && lock.isLocked() && lock.isHeldByCurrentThread()) {
lock.unlock();
LOG.debug("lock released");
}
}
答案 3 :(得分:0)