博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
原子循环计数器
阅读量:7103 次
发布时间:2019-06-28

本文共 935 字,大约阅读时间需要 3 分钟。

感谢同事[孙棋]的投稿

现实当中很多场景,需要进行轮训服务,比如轮训在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,至于为什么要加这个,可参见

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

转载地址:http://qguhl.baihongyu.com/

你可能感兴趣的文章
Contacts Multi Picker
查看>>
[应用模板]HTML5+Phonegap通讯录
查看>>
开源 java CMS - FreeCMS2.6 热词管理
查看>>
from selenium.webdriver.common.keys import Keys
查看>>
mysql 配置
查看>>
AngularJS 中文资料+工具+库+Demo 大搜集
查看>>
碎碎念01
查看>>
微软老将Philip Su的离职信:回首12年职场生涯
查看>>
CentOS 查看IP,端口 修改IP,打开端口生效
查看>>
让history命令可以记录所有shell命令的执行时间
查看>>
SQL联合语句的视觉解释
查看>>
Docker私有仓库Registry搭建(localhost 可行但跨主机有问题)
查看>>
DM 源码阅读系列文章(三)数据同步处理单元介绍
查看>>
android -------- RecyclerView的可(多个Item水平,垂直)滚动列表的实现
查看>>
GoLang练习实例100之009----格式输出当前时间
查看>>
JavaScript实现在线websocket WSS测试工具 -toolfk程序员工具网
查看>>
【分享】WeX5的正确打开方式(1)
查看>>
advanced_CSS_5_2
查看>>
推荐!国外程序员整理的Java资源大全
查看>>
新书《开源安全运维平台OSSIM最佳实践》亮相2016北京图书订货会
查看>>