Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hazelcast分布式锁,带iMap_Java_Multithreading_Locking_Distributed_Hazelcast - Fatal编程技术网

Java Hazelcast分布式锁,带iMap

Java Hazelcast分布式锁,带iMap,java,multithreading,locking,distributed,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");

我们目前正在使用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 hInst=getHazelcastInstance(); 私有IMap MAPOFLOCK=null; ... ... mapOfLocks=hInst.getMap(“mapOfLocks”); if(mapOfLocks.get(name)==null){ 地图(名称1); 锁(名称); } 否则{ mapOfLocks.put(名称,mapOfLocks.get(名称)+1); } ... mapOfLocks.unlock(名称); .. } 早些时候,我曾直接调用HazelcastInstance.getLock(),事情似乎很顺利,但当涉及多个JVM时,我们从未发现任何不合适的地方。 最近,我被要求调查block中的一个数据库死锁,经过几周的调查和日志分析,我能够确定这是由多个线程能够针对同一个密钥获取锁引起的。在第一个线程可以提交代码之前,第二个线程设法获得另一个锁,此时第二个线程被来自第一个线程的数据库锁阻塞

分布式锁的Hazelcast实现是否存在任何突出的缺陷,我是否应该对配置做任何不同的操作?
而且,哦,我的配置禁用了多播,启用了tcp ip

以下是如何将IMap用作锁容器。 您不需要将
名称的条目存在于地图中就可以锁定它

HazelcastInstance instance = Hazelcast.newHazelcastInstance();
IMap<Object, Object> lockMap = instance.getMap("lockMap");
lockMap.lock(name);
try {
    //do some work
} finally {
    lockMap.unlock(name);
}
HazelcastInstance=Hazelcast.newHazelcastInstance();
IMap lockMap=instance.getMap(“lockMap”);
lockMap.lock(名称);
试一试{
//做些工作
}最后{
解锁(名称);
}

以下是如何将IMap用作锁容器。 您不需要将
名称的条目存在于地图中就可以锁定它

HazelcastInstance instance = Hazelcast.newHazelcastInstance();
IMap<Object, Object> lockMap = instance.getMap("lockMap");
lockMap.lock(name);
try {
    //do some work
} finally {
    lockMap.unlock(name);
}
HazelcastInstance=Hazelcast.newHazelcastInstance();
IMap lockMap=instance.getMap(“lockMap”);
lockMap.lock(名称);
试一试{
//做些工作
}最后{
解锁(名称);
}

如果该值确实存在,则您没有锁定它(至少您的代码段没有显示该值)。所以你可能会遇到这个问题。此外,在检查和更新之间,代码不会验证映射值是否没有更改。如果映射值确实重要,那么最好切换到putIfAbsent并替换(K,V,V)。如果该值确实存在,则不会锁定它(至少您的代码段没有显示这一点)。所以你可能会遇到这个问题。此外,在检查和更新之间,代码不会验证映射值是否没有更改。如果map值确实重要,那么最好切换到putIfAbsent并替换(K、V、V)。