原子循环计数器

感谢同事[孙棋]的投稿

现实当中很多场景,需要进行轮训服务,比如轮训在10个日志文件当中写日志,在10台机器上轮训的去调用以实现负载均衡,常规的做法,如tomcat的Poller线程轮训选择,就采用

1 Math.abs(pollerRotater.incrementAndGet()) % pollers.length

此地需要取原子自增的绝对值模以poller线程数,那是否有更好的实现呢?

01 public class CycleAtomicInteger {
02 private final static long PARK_TIME = 1000L * 1000;
03  
04 private AtomicInteger counter = new AtomicInteger(0);
05  
06 private int range;
07  
08 public CycleAtomicInteger(int range) {
09     if (range < 2)
10         throw new IllegalArgumentException();
11     this.range = range;
12 }
13  
14 /**
15  * 获取下个原子值
16  *
17  * @return
18  */
19 public int next() {
20     for (;;) {
21         int c = counter.get();
22         int next = (c + 1) % range;
23         if (counter.compareAndSet(c, next)) {
24             return c;
25         } else {
26             LockSupport.parkNanos(PARK_TIME);
27         }
28     }
29 }
30  
31 }

这样就可以快速的实现rr的效果,同时也避免了abs的过程,至于LockSupport.parkNanos(PARK_TIME);加了这个后,4个线程执行2亿次的计算,我本机从原来的16s减少到4s,至于为什么要加这个,可参见更快的AtomicInteger

当然,这样设计会存在cas的aba问题,但对当前的case需求,其实是满足的,也不存在问题

时间: 2024-08-04 01:01:58

原子循环计数器的相关文章

并发网2014.7月阅读量Top10

也许每天大家都在匆忙的工作,学习的时间非常短暂,也许网站的内容太多,不知道应该看哪一篇.所以从本月开始会向各位推送并发网每月Top10的阅读量的文章,希望各位能喜欢!有任何意见和建议,欢迎告诉我们,小编一定尽力满足各位. Top1  Netty 5用户指南  Netty是一个提供异步事件驱动的网络应用框架,用以快速开发高性能.高可靠性的网络服务器和客户端程序. 换句话说,Netty是一个NIO框架,使用它可以简单快速地开发网络应用程序,比如客户端和服务端的协议.Netty大大简化了网络程序的开发

VBA循环语句

语句除了判断语句外,还有循环语句,有以下几种形式: 1.While...Wend 语句.语法 : While condition [statements] Wend While...Wend 语句的语法具有以下几个部分: 部分 描述 condition必要参数.数值表达式或字符串表达式,其计算结果为True 或 False.如果 condition 为 Null,则condition 会视为 False. statements 可选参数.一条或多条语句,当条件为True 时执行. 2.Do...

XSLT中用递归实现循环

XSLT 是图灵完成的(Turing complete).也就是说,如果有足够的内存,那么 XSLT 可以完成其他任何图灵完成语言(如 C++)所能完成的计算.对于属性更传统的语言的程序员来说,这可能有点奇怪.毕竟 XSLT 缺少对很多算法来说极其重要的特性,其中包括循环和可变的变量. 注意:XSLT 所谓的变量在其他多数语言中称为常量.它们更像是代数变量而不是传统的编程变量. 函数式编程 上述的遗漏并非疏忽所致.XSLT 是一种函数式语言而不是过程性语言.在 C 或 Pascal 这样的过程性

7.Swift教程翻译系列——控制流之循环

英文版PDF下载地址http://download.csdn.net/detail/tsingheng/7480427 Swift提供了类C语言类似的控制流结构.包括for循环和while循环来多次执行任务,if和switch语句根据不同的条件执行不同的分支代码,break和continue语句将执行流程跳转到其他语句. 除了C里面传统的for-条件-递增循环,Swift还增加了for-in循环使得遍历数组,字典,范围,字符串或者其他序列都很简单. Swift的switch语句也要比C语言的sw

ios-循环计数器-最短算法

问题描述 循环计数器-最短算法 功能:每次按钮按下,就会生成一个整数,然后达到最大值再返回0. 我想要最短的实现算法. 比如像这样.从0到6,再从6到0. count ++; count *= (count != 7); 解决方案 使用模数 count = (count + 1) % 7

JavaScript中对循环语句的优化技巧深入探讨_javascript技巧

循环是所有编程语言中最为重要的机制之一,几乎任何拥有实际意义的计算机程序(排序.查询等)都里不开循环. 而循环也正是程序优化中非常让人头疼的一环,我们往往需要不断去优化程序的复杂度,却因循环而纠结在时间复杂度和空间复杂度之间的抉择. 在 javascript 中,有3种原生循环,for () {}, while () {}和do {} while (),其中最为常用的要数for () {}. 然而for正是 javascript 工程师们在优化程序时最容易忽略的一种循环. 我们先来回顾一下for

for循环语句的入门教程

对于使用for循环语句时,你知道有多少次你想执行一个语句或语句的列表.为此, For循环称为一个明确的循环.在循环的语法是有点复杂,但对循环往往比在循环方便 . for循环的语法如下: for (initialization; condition; increment) {    code to be executed; } for语句时3括号内的半分开,冒号表达式.当for循环执行时,发生以下情况: 初始化表达式的执行.这个表达式通常初始化一个或多个循环计数器,但语法允许任 何复杂程度的表达.

多重for循环的continue问题

问题描述 import java.util.ArrayList;import java.util.Arrays;import java.util.HashSet;import java.util.List;import java.util.Set;public class Problem60 {public static boolean[] prime = new boolean[1000000];public static boolean IsPrime(long number) {for (

Java核心技术卷I基础知识3.8.4 确定循环

3.8.4 确定循环 for循环语句是支持迭代的一种通用结构,利用每次迭代之后更新的计数器或类似的变量来控制迭代次数.如图3-12所示,下面的程序将数字1-10输出到屏幕上.   图3-11 do/while语句的流程图 ???图3-12 for语句的流程图 for语句的第1部分通常用于对计数器初始化:第2部分给出每次新一轮循环执行前要检测的循环条件:第3部分指示如何更新计数器. 与C++一样,尽管Java允许在for循环的各个部分放置任何表达式,但有一条不成文的规则:for语句的3个部分应该对