可以使用hazelcast IMap仅用于锁定目的吗?

时间:2014-05-27 08:58:22

标签: java synchronization locking hazelcast

目前据我所知,使用IMap#tryLock后不需要使用任何破坏方法,这与ILock不同。

将从HazelcastInstance检索到的所有ILocks更改为IMaps并使用类似于下面所示的代码是不是一种好的或坏的做法?

public final T execute(){
    try{
        imapForLocking.tryLock(nonexistentInMapStringKey);
        return executeCodeUnrelatedToMap();
    }finally{
        imapForLocking.unlock(nonexistentInMapStringKey);
    }
}

2 个答案:

答案 0 :(得分:2)

https://groups.google.com/forum/#!topic/hazelcast/9YFGh3xwe8I

找到我的答案

hazelcast开发人员鼓励使用IMap进行锁定而不是ILock

  

是的,你必须调用destroy,因为所有ILock对象都保存在内存中。   您还可以使用分布式地图作为锁:

     

IMap mapLocks = hazelcastInstance.getMap(" mylocks");   mapLocks.lock(theKey);

     

当你调用mapLocks.unlock(theKey)时,你的锁是   自动垃圾回收。这更简单,更快速,更清洁。

答案 1 :(得分:0)

为什么你认为你不需要任何破坏方法?

可能你应该始终保持lock / try / finally / unlock模式,因为最终锁定可能需要在释放之前超时。

iMap.lock("foo");
try {
    // do something else
} finally {
    iMap.unlock("foo");
}

但实际上如果您觉得需要锁定地图以进行一些更改,您可能希望使用EntryProcessor,它将在密钥所有者上运行并为您提供隐式锁定,因此您实际上并没有需要真正的锁定但具有相同的行为。 锁定本身总是一种昂贵且不可取的操作。