关于 java:在多个 JVM 上为每个键原子地更新整数

Updating integer atomically over multiple JVMs for every key

我们有一个要求,可以将问题范围缩小为。

  • 有多个键,每个键映射到一个整数。
  • 当在 JVM 上接收到键时,您需要从共享内存中检索 int 值,将其递增,然后将递增后的值放回共享内存。

因此,当两个 JVM 或两个线程读取相同的值时,其中一个的更新应该始终失败,这样您就不会丢失任何 JVM 上的任何线程所做的任何增量。

一旦更新失败,你就从共享内存中再次读取,增加它然后再次更新,直到更新成功或者你已经用尽了\\'N\\'次重试。

现在我们正在使用带有乐观锁定的 infinispan,但行为并不一致。请找到该主题的链接。

https://developer.jboss.org/message/914490

有没有其他技术可以很好地满足这个要求。


线程之间的同步很容易,但 JVM 之间的同步非常困难,尤其是当您需要支持多个平台时。我建议使用以下方法之一集中更新代码,这两种方法都"外包"数据更新任务:

  • 从知道如何执行更新任务的单个进程发布一个简单的 REST API,并序列化请求。
  • 使用关系数据库保存计数,并确保客户端代码在事务不成功时正确回滚事务。

可能不是你想听到的,但任何一种方法都行得通。