`
sunqi
  • 浏览: 230836 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

原子循环计数器

    博客分类:
  • java
 
阅读更多

现实当中很多场景,需要进行轮训服务,比如轮训在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)) {
            return c;
        } else {
            LockSupport.parkNanos(PARK_TIME);
        }
    }
}

}

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

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

分享到:
评论

相关推荐

    计数器 C

    在循环结构(如for循环或while循环)中,计数器经常用于控制循环的迭代次数。例如,一个简单的for循环用于打印0到999的数字: ```c for(int counter = 0; counter ; counter++) { printf("%d ", counter); } `...

    0-50000的计数器

    2. **软件实现**:在软件层面,计数器可能由一段循环代码实现,每次循环时将计数值加1。这可能涉及到对特定寄存器的读写操作,以及条件判断来防止溢出。 3. **中断服务**:为了确保计数的准确性和实时性,可能需要...

    kotlinx.atomicfu,在kotlin中使用原子操作的惯用方法.zip

    5. **线程安全与并发策略**: 使用AtomicFu提供的原子类可以确保在多线程环境中的线程安全性,但开发者仍需要注意并发策略,比如避免死循环和活锁,合理设计同步逻辑,以及避免过度依赖原子操作导致的其他潜在问题。...

    原子操作、信号量、读写信号量和自旋锁的API

    原子操作提供了一种简单而有效的方法来维护这种计数器。 **API介绍**: 原子操作的API主要定义在`include/asm/atomic.h`文件中,这些API通常用汇编语言实现,因为C语言本身无法直接支持原子性操作。以下是常用的几...

    防刷计数器

    6. **计数器数值显示**:最后,通过循环和字符串处理,将计数器的数值转换为图片格式显示,增加了网页的美观性,同时也是一种防止自动识别的策略。 #### 三、优化与安全考量 虽然上述代码实现了一个基本的防刷...

    正点原子STM32,看门狗实验,是广大单片机开发者学习者最适合的学习资料.zip

    "正点原子STM32,看门狗实验"是一份专为单片机开发者和学习者准备的教程资料,旨在帮助他们理解和掌握STM32芯片中的看门狗功能。 看门狗定时器(Watchdog Timer,WDT)是一种硬件错误检测机制,用于防止程序因意外的...

    3、并发编程之CAS&amp;Atomic原子操作详解.pdf

    这些类使用了循环CAS机制来保证操作的原子性。以下是一些常用的原子类及其方法示例: 1. **AtomicInteger** - `int addAndGet(int delta)`:以原子方式将输入的数值与实例中的值相加,并返回结果。 - `boolean ...

    正点原子stm32培训资料.zip

    正点原子的STM32培训资料是一套针对初学者的详细教程,旨在帮助用户快速掌握STM32的基础知识和实战技能。 【STM32概述】 第一讲中,主要介绍了STM32的基本架构,包括其内核——Cortex-M3或Cortex-M4,以及STM32家族...

    正点原子arm汇编代码

    在ARM中,有多个通用寄存器(R0-R15)供程序使用,其中R13通常作为堆栈指针,R14作为链接寄存器,R15是程序计数器(PC)。理解这些寄存器的作用对于编写汇编代码至关重要。 四、裸机编程 "裸机例程"通常指的是不...

    原子FAA对ParallelFor的影响及改进成本模型_Influence of atomic FAA on ParallelF

    在并行循环中,每个线程可能需要通过FAA操作更新共享计数器或状态,这导致了额外的开销,包括内存访问冲突、缓存不一致性和处理器资源竞争。 为了验证这一假设,作者在不同的硬件平台上设计并执行了一系列测试。...

    Java并发编程之美_部分71

    CAS 失败则循环重试,否则如果当前计数器值为 0 则返回 true,返回 true 说明是最后一个线程调用的 countdown 方法,那么该线程除了让计数器值减 1 外,还需要唤醒因调用 await 方法而被阻塞的线程,具体是调用 AQS ...

    stm32贪吃蛇游戏程序(原子开发板上写的)

    2. **定时器中断**:游戏的帧率通常由定时器中断控制,通过调整定时器的预分频值和计数器值来实现不同的刷新率。当定时器溢出时,触发中断服务函数,更新屏幕显示和蛇的移动。 3. **LCD或LED驱动**:根据开发板的...

    计数器1.0.0

    这可能涉及到锁机制,如互斥量(Mutex)或信号量(Semaphore),或者使用无锁数据结构如原子变量(Atomic Integer)。 4. **数据持久化**:为了防止程序意外退出导致计数数据丢失,计数器可能有数据持久化的功能,...

    arm_plat1.rar_占空比 循环

    这可能涉及到设置定时器的分频器、计数器初始值、比较寄存器值等。 2. **设置PWM通道**:S5PV210可能有多个PWM通道,我们需要指定一个通道,并配置其比较值以设定初态的占空比。比如,如果要设置90%的占空比,我们...

    北雨访问记数器

    根据不同的实现,可能会涉及原子操作、线程安全等算法和技巧,以确保在高并发环境下计数的准确性。 3. 网络编程基础:访问计数器需要处理HTTP请求,这涉及到网络编程知识,如TCP/IP协议、HTTP协议的理解,以及如何...

    4x4矩阵键盘

    这通常是通过设置特定的延时函数或者计数器来实现的,例如设置一个时间阈值,只有当按键释放后再按下且间隔超过这个时间才被认为是新的按键事件。 4x4矩阵键盘的应用非常广泛,常见于计算器、电子琴、游戏控制器...

    使用C语言在多线程环境中使用句柄和侵入式引用计数器

    4. **循环引用**:尽管侵入式引用计数器简化了内存管理,但它无法解决循环引用问题。如果两个或更多对象相互引用,它们的引用计数器可能永远不会为零,导致内存泄漏。可以使用弱引用(weak reference)或其他更复杂...

Global site tag (gtag.js) - Google Analytics