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 检查。
我正在尝试创建一个基础架构,让不同的机器通过 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 检查。