gpt4 book ai didi

java - Redis的Redisson的API方法.unlock()未释放锁,尝试从同一实例进行

转载 作者:行者123 更新时间:2023-12-03 06:44:28 29 4
gpt4 key购买 nike

我已经在Java应用程序中创建了单例redisson实例,用于与Redis服务器进行通信。
现在,使用此重做实例,我将获得一个锁,该锁在完成某些任务后将释放。但是在调用unlock方法之后,我仍然看到redis具有锁定,而其他线程无法获取该锁定。
以下是我正在使用的代码段:

class RedisInstance
{
static RedisInstance ins;
private RedisInstance()
{
ins = new RedisInstance();
}
public static RedisInstance getInstance()
{
return ins;
}
//Acquire the lock:
public boolean acquireLock(String lockKey)
{
RLock redisLock = getRedisClient().getLock(lockKey);
boolean isLockFree;
try
{
isLockFree = redisLock.tryLock(lockAcquistionTimeLimit, TimeUnit.SECONDS);
if(isLockFree)
{
redisLock.lock();
logger.info("lock acquired for: {}", lockKey);
return true;
}
}
catch (InterruptedException e)
{
logger.error("Got exception {} in acquiring Redis Lock for: {}" , e, lockKey);
}

return false;
}


//Release the lock:
public void unlock(String lockKey)
{
RLock redisLock = getRedisClient().getLock(lockKey);
redisLock.unlock();
logger.debug("IS redis locked "+redisLock.isLocked());
logger.info("lock released for: {}", lockKey);
}
}
class A
{
RedisIns ins = RedisInstance.getInstance();
public void run()
{
if(ins.acquireLock(lockKey))
{
try
{
//do some processing takes less than a second
}
catch(Exception e)
{

}
finally
{
ins.unlock(lockKey);
}
}
}
//In my main method:
public static void main(String args[])
{
A a = new A();
A b = new A();
Thread t1 = new Thread(a);
Thread t2 = new Thread(b);
t1.start();
Thread.sleep(5000); //just to mock, lets say t1 finishes before t2 starts
t2.start();
}
}
在t1调用 ins.unlock(lockKey);之后,日志 logger.debug("IS redis locked "+redisLock.isLocked());说:true,并且 t2无法获取锁。
但是,如果我将 redisLock.unlock();替换为 redisLock.forceUnlock();,那么一切都会按预期进行。
不知道为什么unlock()无法释放锁forceUnlock()能够做到。

最佳答案

tryLock如果获取了锁,则返回true。因此,在此之后不需要调用锁,我认为这可能是导致您出现问题的原因。该实现可能期望锁定/解锁的数量为偶数,并且在这种情况下,您的锁定要比解锁多。

关于java - Redis的Redisson的API方法.unlock()未释放锁,尝试从同一实例进行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63839691/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com