每个键在多个JVM上以原子方式更新整数

时间:2014-12-24 03:53:28

标签: java multithreading

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

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

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

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

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

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

是否还有其他适合此要求的技术。

1 个答案:

答案 0 :(得分:1)

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

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

可能不是你想听到的,但任何一种方法都能很好地运作。