美文网首页
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