【问题标题】:Hazelcast Distributed Lock with iMapHazelcast 分布式锁与 iMap
【发布时间】:2015-08-26 06:13:36
【问题描述】:

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

【问题讨论】:

  • 如果该值确实存在,则您没有锁定它(至少您的代码 sn-p 没有显示这一点)。所以你可以在这里遇到这个问题。此外,您的代码不会验证地图值在您的检查和更新之间没有改变。如果地图值确实很重要,最好切换到 putIfAbsent 和 replace(K,V,V)。

标签: java multithreading locking distributed hazelcast


【解决方案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);
}

【讨论】:

    猜你喜欢
    • 2018-05-05
    • 1970-01-01
    • 2018-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多