Hazelcast分布式锁使用IMAP(Hazelcast Distributed Lock wit

2019-10-23 08:37发布

目前,我们正在使用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

Answer 1:

这里是你如何使用IMAP作为的锁盒。 你并不需要有条目name出现在地图上,以将其锁定。

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


文章来源: Hazelcast Distributed Lock with iMap