1

我有一個要求,我找不到使用榛樹IMap和ILock結構的解決方案。Hazelcast - 將鎖鍵與地圖值關聯以進行鎖定監視的策略/算法?

我需要跟蹤通過分佈式映射獲取的所有鎖定(在成功完成IMap.tryLock(K鍵)調用後獲取的鎖定)。 每個成功獲取的鎖都必須與地圖中的自定義對象關聯/配對以進行跟蹤。 (這些自定義對象包含用於監視目的的特定於應用程序的更衣室信息。) 我想要的是,當成功獲取鎖定時,與鎖有關的相關自定義對象必須以自動方式自動放置到地圖。 並且當鎖被釋放時,與鎖相關的相關自定義對象必須自動被原子驅逐。

換句話說,我想跟蹤所有未發佈的鎖的鎖櫃信息是否正確。

我第一次嘗試/趨勢是實現鎖定工具方法如下圖所示:

public boolean tryLockUtilMethod(String key, long maxTimeToWaitForTheLockInMilis) { 
     boolean isLockAcquired = false; 
     try { 
      isLockAcquired = IMap.tryLock(key, maxTimeToWaitForTheLockInMilis, TimeUnit.MILLISECONDS); 
     } catch (Exception e) { 
      ... 
     } 

     if (isLockAcquired) { 
      putLockInfoToMapAfterLockAcquire(key); 

     } 
    } 

和下方的解鎖工具方法:

public void unlockUtilMethod(String key) { 

      boolean isUnlockSuccess = false; 

      try { 
       IMap.unlock(key); 
       isUnlockSuccess = true; 
      } catch (IllegalMonitorStateException e) { 
       // current thread does not hold the lock 
       ... 
      } catch (Exception ex) { 
       ... 
      } 

      if (isUnlockSuccess) { 
       removeLockInfoAfterUnlockSuccess(key); 
      } 
     } 

顯然,這種方法很容易出錯,因爲鎖獲取/釋放操作和隨後的地圖放置(在示例代碼中使用putLockInfoToMapAfterLockAcquire方法)/ remove(在示例代碼中removeLockInfoAfterUnlockSuccess方法)操作不是原子化的...

我找不出使用hazelcast併發構造的解決方案。

什麼是保持鎖相關信息並確保它們與鎖同步的正確方法?以前沒有人有類似的要求嗎?

任何指導表示讚賞

回答

1

AFAIK沒有對穿越或獲取有關其在IMAP interface.So獲得的鎖信息的API水平沒有直接的支持,我覺得你自己做這件事的方式是正確的。並且爲了同步鎖定信息和鎖定,您可以使用hazelcast transactions.