[英]Redis's Redisson's API method .unlock() is not releasing the lock, trying from the same instance
我在我的 Java 應用程序中創建了單例 redisson 實例,我用它來與 redis 服務器進行通信。 現在使用這個 redisson 實例,我正在獲取一個鎖,在完成一些任務后,我正在釋放。 但是在調用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。 所以調用 lock after 是不必要的,我認為這可能是你問題的原因。 該實現可能需要偶數個鎖定/解鎖,在您的情況下,您的鎖定比解鎖多一個。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.