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.