Lock on a key in a hazelcast cluster
我正在编写一个使用 Hazelcast(JCache 标准)进行缓存的分布式应用程序。
我有一个用例,我应该锁定集群中的特定键,以防止在更新期间调用。
我知道EhCache 有一个非常相似的东西,它叫做acquireReadLockOnKey(Object key)。
如何使用 JCache 和/或 Hazelcast 实现这种锁定?
我建议使用 CAS(比较和设置)类似的操作(如 ConcurrentMap::replace)并使用本身不是真正锁的乐观锁定模式。
1 2 3 4 5 6 7 8 9 | while(true) { // Get the old value T oldValue = map.get(key); // Create the new value based on the"known old state" T newValue = createNewValue(oldValue); // Try to atomically exchange to the new value, if oldValue is still valid if (map.replace(key, oldValue, newValue) break; // If oldValue isn't valid anymore, retry } |
在大多数不存在高争用率的情况下,这是相对于真正锁定的最佳选择。它解决了大多数读取-修改-写入问题,并且不需要在集群上部署/可用 EntryProcessor 类。
看看条目处理器,它以原子和无锁的方式对缓存条目执行更新操作。