Hazelcast 分布式锁与 iMap



我们目前正在使用Hazelcast 3.1.5。我有一个简单的分布式锁定机制,应该在多个 JVM 节点之间提供线程安全。代码非常简单。

 private static HazelcastInstance hInst = getHazelcastInstance();
 private IMap<String, Integer> mapOfLocks = null;
  ...
  ...
   mapOfLocks = hInst.getMap("mapOfLocks");
        if (mapOfLocks.get(name) == null) {
            mapOfLocks.put(name,1);
            mapOfLocks.lock(name);
        }
        else {
            mapOfLocks.put(name,mapOfLocks.get(name)+1);
        }
         ...
         <STUFF HAPPENS HERE>
         mapOfLocks.unlock(name);
         ..
    }

早些时候,我曾经直接调用 HazelcastInstance.getLock(),事情似乎很正常,尽管当涉及多个 JVM 时,我们从未发现任何不合适的情况。最近,我被要求调查块中的数据库死锁,经过数周的调查和日志分析,我能够确定这是由于多个线程能够针对同一键获取锁引起的。在第一个线程可以提交代码之前,第二个线程设法获得另一个锁,此时第二个线程被第一个线程的数据库锁阻止。

是否存在任何针对分布式锁的 Hazelcast 实现的突出错误,我应该对我的配置做任何不同的事情吗?而且,哦,我的配置已禁用组播并启用 tcp-ip

下面介绍如何将 IMap 用作锁定容器。您无需为地图中存在的name输入即可锁定它。

HazelcastInstance instance = Hazelcast.newHazelcastInstance();
IMap<Object, Object> lockMap = instance.getMap("lockMap");
lockMap.lock(name);
try {
    //do some work
} finally {
    lockMap.unlock(name);
}

最新更新