Redisson从不同线程释放锁

Redisson release lock from different threads

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

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

所以,我理解那个意思,但是因为我要进行异步工作,所以不能使用获取线程来进行释放。

我不应该使用 Redisson 锁吗?像这样的异步工作最适合什么?

正如 zapl 提到的,Java documentation 表明这是 java 锁的正确行为。 在 Reddison's GitHub page 上讨论了这个问题后,Redisson Lock 似乎不是为此设计的,Redisson 信号量将很快支持异步操作。

同时,我打算分配一个线程来执行所有的锁定和解锁。由于 Redisson 支持异步、非阻塞调用,因此这个解决方案目前看来是合理的。

我建议使用 Redisson 信号量对象。从 2.2.14 版本开始,它通过 RSemaphoreAsync 接口支持异步操作。

因为您的服务 运行 在多个节点上。建议您在解锁前使用 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");
  }
}

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

另一种方式请参考https://github.com/redisson/redisson/issues/2224 您可以使用 lockAsync(threadId)unlockAsync(threadId) 绕过线程 ID 检查。