美文网首页
PositiveAtomicCounter(正数原子递增器-用于

PositiveAtomicCounter(正数原子递增器-用于

作者: 小胖学编程 | 来源:发表于2021-06-23 17:06 被阅读0次

当int类型到达2147483647时,在+1操作,会得到什么值?该值是否可以用于路由的轮询操作?

1. int类型到达2147483647的+1操作

image.png

当达到2^31-1时,在+1操作,得到的是-2^31

2. 0x7FFFFFFF的&操作

该操作保证了2^31-1时,在+1操作后依旧从0开始。

image.png

3. 正数原子递增器实现原理

  • 原子性:要保证操作是原子的,线程安全的,java的atomatic包里的AtomicInteger符合这种要求;
  • 正数性:数字在java中是用补码进行表示的,第一位为符号位,0代表正数,1代表负数,可以对递增的数值进行与0x7FFFFFFF(int类型,4个字节)操作,保证永远为正数。当递增超过0x7FFFFFFF时,又会从0开始递增;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * 正数的原子递增器,主要用于实现轮询
 *
 */
public class PositiveAtomicCounter {

    private static final int MASK = 0x7FFFFFFF;
    private final AtomicInteger atom;

    public PositiveAtomicCounter() {
        atom = new AtomicInteger(0);
    }

    public final int incrementAndGet() {
        return atom.incrementAndGet() & MASK;
    }

    public final int getAndIncrement() {
        return atom.getAndIncrement() & MASK;
    }

    public int get() {
        return atom.get() & MASK;
    }


    public static void main(String[] args) {
        AtomicInteger atom = new AtomicInteger(2147483647);
        System.out.println(atom.incrementAndGet() & MASK);
    }
}

相关文章

网友评论

      本文标题:PositiveAtomicCounter(正数原子递增器-用于

      本文链接:https://www.haomeiwen.com/subject/riibyltx.html