目前据我所知,使用IMap#tryLock后不需要使用任何破坏方法,这与ILock不同。
将从HazelcastInstance检索到的所有ILocks更改为IMaps并使用类似于下面所示的代码是不是一种好的或坏的做法?
public final T execute(){
try{
imapForLocking.tryLock(nonexistentInMapStringKey);
return executeCodeUnrelatedToMap();
}finally{
imapForLocking.unlock(nonexistentInMapStringKey);
}
}
答案 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,它将在密钥所有者上运行并为您提供隐式锁定,因此您实际上并没有需要真正的锁定但具有相同的行为。 锁定本身总是一种昂贵且不可取的操作。