Java 在多个JVM上为每个键原子地更新整数

Java 在多个JVM上为每个键原子地更新整数,java,multithreading,Java,Multithreading,我们有一个要求,这个问题可以尽可能缩小 有多个键,每个键映射到一个整数 当JVM上接收到密钥时,您需要从共享内存中检索int值,将其递增,然后将递增的值放回共享内存中 因此,当两个JVM或两个线程读取相同的值时,其中一个线程的更新应该一致失败,这样就不会丢失任何JVM上任何线程所做的任何增量 一旦更新失败,您将再次从共享内存中读取数据,增加数据量,然后再次更新,直到更新成功或重试次数达到“N” 现在我们正在使用带有乐观锁定的infinispan,但其行为并不一致。请找到该线程的链接 是否有

我们有一个要求,这个问题可以尽可能缩小

  • 有多个键,每个键映射到一个整数
  • 当JVM上接收到密钥时,您需要从共享内存中检索int值,将其递增,然后将递增的值放回共享内存中
因此,当两个JVM或两个线程读取相同的值时,其中一个线程的更新应该一致失败,这样就不会丢失任何JVM上任何线程所做的任何增量

一旦更新失败,您将再次从共享内存中读取数据,增加数据量,然后再次更新,直到更新成功或重试次数达到“N”

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


是否有其他技术可以很好地满足这一要求。

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

  • 从知道如何执行更新任务的单个进程发布一个简单的RESTAPI,并序列化请求
  • 使用关系数据库保存计数,并确保客户端代码在事务不成功时正确回滚事务
可能不是你想听的,但这两种方法都很有效。

我用过几十台机器。不知道你是否能考虑。