使用iMap进行Hazelcast分布式锁定

时间:2015-06-10 19:37:17

标签: 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时我们从未看到任何不合适的地方。 最近,我被要求在块中调查数据库死锁,经过数周的调查和日志分析,我能够确定这是由多个线程能够获取针对相同密钥的锁定引起的。在第一个线程可以提交代码之前,第二个线程设法获得另一个锁,此时第二个线程被第一个线程的数据库锁阻塞。

对于分布式锁的Hazelcast实现是否有任何未解决的错误,我应该对我的配置采取哪些不同的做法? 而且,我的配置已禁用多播并启用了tcp-ip

1 个答案:

答案 0 :(得分:6)

以下是如何将IMap用作锁定容器的方法。 您无需为地图中的HazelcastInstance instance = Hazelcast.newHazelcastInstance(); IMap<Object, Object> lockMap = instance.getMap("lockMap"); lockMap.lock(name); try { //do some work } finally { lockMap.unlock(name); } 输入以锁定它。

@media (max-width: @grid-float-breakpoint-max) {

 .navbar-default .navbar-nav .open .dropdown-menu {
   > li > a {
     color: @dropdown-link-color;
     &:hover,
     &:focus {
       color: @dropdown-link-hover-color;
       background-color: @dropdown-link-hover-bg;
     }
   }
   > .active > a {
     &,
     &:hover,
     &:focus {
       color: @dropdown-link-active-color;
       background-color: @dropdown-link-active-bg;
     }
   }
 }

}