簡體   English   中英

Redis Redisson 的API 方法.unlock() 不釋放鎖,嘗試從同一個實例

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM