Rediss Redisson的API方法.unlock()没有释放锁,而是从同一个实例尝试



我在Java应用程序中创建了singleton redison实例,用于与redis服务器通信。现在使用这个redison实例,我正在获取一个锁,在完成一些任务后,我将释放它。但在调用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.forceUnlock();替换redisLock.unlock();,一切都会按预期进行。不知道为什么unlock((无法释放锁定力unlock((可以做到。

tryLock如果获取了锁,则返回true。所以在之后调用lock是不必要的,我认为这可能是您问题的原因。实现可能需要偶数个锁定/解锁,在您的情况下,您的锁定比解锁多了一个。

相关内容

最新更新