Redisson释放锁定来自不同的线程

时间:2016-05-22 13:17:24

标签: java redis locking redisson

我正在尝试创建一个基础架构,其中不同的机器通过Redisson获取共享锁。一旦锁定被获取,一些异步任务就完成了,最后,当我完成工作时,我通过当前运行的线程释放Redisson锁 - 但是我收到以下错误

java.lang.IllegalMonitorStateException: attempt to unlock lock, not locked by current thread by node id: xxxxx thread-id: 57

所以,我理解它的含义,但由于我想执行异步工作,我不能使用获取线程来执行发布。

我不应该使用Redisson锁吗?像这样的异步工作的最佳匹配是什么?

4 个答案:

答案 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)

我使用 forceUnlock() 而不是 unlock(),它可以工作并成功释放另一个线程锁定的锁,但可能不是推荐的方法。

另一种方式请参考enter image description here 您可以使用 lockAsync(threadId)unlockAsync(threadId) 来检查线程 ID。