Sri*_*thy 1 java multithreading distributed locking 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);
..
}
Run Code Online (Sandbox Code Playgroud)
早些时候,我曾经直接调用HazelcastInstance.getLock()并且事情似乎有效,尽管我们从未在涉及多个JVM时看到任何不合适的地方.最近,我被要求在块中调查数据库死锁,经过数周的调查和日志分析,我能够确定这是由多个线程能够获取针对相同密钥的锁定引起的.在第一个线程可以提交代码之前,第二个线程设法获得另一个锁,此时第二个线程被第一个线程的数据库锁阻塞.
是否存在针对Hazelcast实现分布式锁的未解决的错误,我应该对我的配置采取哪些不同的做法?而且,我的配置已禁用多播并启用了tcp-ip
小智 6
以下是如何使用IMap作为锁容器.您不需要name在地图中输入当前的条目以锁定它.
HazelcastInstance instance = Hazelcast.newHazelcastInstance();
IMap<Object, Object> lockMap = instance.getMap("lockMap");
lockMap.lock(name);
try {
//do some work
} finally {
lockMap.unlock(name);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4006 次 |
| 最近记录: |