java - 使用 Java 原子类进行模块化增量

标签 java modulo atomic

令我惊讶的是,Java 的 AtomicInteger 和 AtomicLong 类没有模块化增量的方法(以便在达到限制后值回绕到零)。

我想我一定错过了一些明显的东西。最好的方法是什么?

例如,我想在线程之间共享一个简单的 int,并且我希望每个线程都能够递增它,例如 mod 10。

我可以创建一个使用同步/锁的类,但是有更好、更简单的方法吗?

最佳答案

读取时只需将值取模 10 即可?

public class AtomicWrappingCounter {
  private final AtomicLong counter = new AtomicLong();
  private final int max;

  public AtomicWrappingCounter(int max) {
    this.max = max;
  }

  public int get() {
    return (int) (counter.get() % max);
  }

  public int incrementAndGet() {
    return (int) (counter.incrementAndGet() % max);
  }
}

显然,如果您可能将此计数器增加超过 Long.MAX_VALUE 次,则无法使用此方法,但 9 quintillion 是需要增加的很多次(大约 292 年)每纳秒 1 个!)。

关于java - 使用 Java 原子类进行模块化增量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4810881/

相关文章:

java - Toolkit.getDefaultToolkit().getScreenSize() 无法获取正确的屏幕分辨率值

Java 进程卡在 SIGTERM 处理程序中删除文件

python - 求解大数的模线性同余

c++ - 随机数生成的快速模数替换是什么?

algorithm - 计算线性序列模 n 的总和

java - 更改 "roll back"的最佳方法是什么?

mongodb - 嵌入式文档上 findAndModify 的原子性

java - 在 Java 中超出数组限制后显示消息

java - 数组列表输出

c++ - x86(_64) 上的原子计数器和自旋锁的成本