令我惊讶的是,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/