java - 使用 iMap 的 Hazelcast 分布式锁

标签 java multithreading locking distributed hazelcast

我们目前使用的是 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 时我们从未发现任何不合适的地方。 最近,我被要求调查 block 中的数据库死锁,经过数周的调查和日志分析,我能够确定这是由于多个线程能够针对同一键获取锁造成的。在第一个线程提交代码之前,第二个线程设法获得另一个锁,此时第二个线程被第一个线程的数据库锁阻塞。

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

最佳答案

以下是如何将 IMap 用作锁容器。 您不需要为 map 中存在的 name 条目来锁定它。

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

关于java - 使用 iMap 的 Hazelcast 分布式锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30765727/

相关文章:

java - 数据库助手类?

java - AMQP 异步监听器仅在事件发生后才开始监听消息

.net - Interlocked.CompareExchange(double,double,double) 在 32 位操作系统中工作吗?

c# - 从存储在 MYSQL 中的 C# 生成唯一 ID

java - 有哪些免费工具可用于分析 java 中的锁争用?

java - 不可变是什么意思?

java - XOM 和规范 XML

java - Java中的同步嵌套集合

java - 识别用于在 Java 中显示频繁数据输入的 Swing 线程

c - stat() 系统调用被阻止