1

我正在编写一个使用 Hazelcast(JCache 标准)进行缓存的分布式应用程序。

我有一个用例,我应该锁定集群中的特定键,以防止在更新期间调用。

  1. thread1:获取 item1 以进行配置更改(加锁)
  2. thread2:获取 item1 进行更新。
  3. thread2:将 item1 与更新和新时间戳一起放入。
  4. thread1:将 item1 与旧值和时间戳一起放置

我知道 EhCache 有一些非常相似的东西,它叫做acquireReadLockOnKey(Object key)。

如何使用 JCache 和/或 Hazelcast 实现这种锁定?

4

2 回答 2

4

我建议使用 CAS(比较和设置)类似的操作(如 ConcurrentMap::replace)并利用本身不是真正锁的乐观锁定模式。

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 类。

于 2017-06-01T12:02:42.280 回答
3

查看条目处理器,它以原子和无锁的方式对缓存条目执行更新操作。

于 2017-06-01T10:29:57.090 回答