感谢同事[孙棋]的投稿
现实当中很多场景,需要进行轮训服务,比如轮训在10个日志文件当中写日志,在10台机器上轮训的去调用以实现负载均衡,常规的做法,如tomcat的Poller线程轮训选择,就采用
Math.abs(pollerRotater.incrementAndGet()) % pollers.length
此地需要取原子自增的绝对值模以poller线程数,那是否有更好的实现呢?
public class CycleAtomicInteger {
private final static long PARK_TIME = 1000L * 1000;
private AtomicInteger counter = new AtomicInteger(0);
private int range;
public CycleAtomicInteger(int range) {
if (range < 2)
throw new IllegalArgumentException();
this.range = range;
}
/**
* 获取下个原子值
*
* @return
*/
public int next() {
for (;;) {
int c = counter.get();
int next = (c + 1) % range;
if (counter.compareAndSet(c, next)) {