神奇的AtomicInteger

  • 当AtomicInteger的值为最大值2147483647时,执行incrementAndGet()会发生什么?
  • 当AtomicInteger的值为最小值-2147483648时,执行decrementAndGet()会发生什么?
        AtomicInteger max = new AtomicInteger(Integer.MAX_VALUE);
        System.out.println(max);
        System.out.println(max.incrementAndGet());
        System.out.println("--------------------");
        AtomicInteger min = new AtomicInteger(Integer.MIN_VALUE);
        System.out.println(min);
        System.out.println(min.decrementAndGet());

测试结果如下:

2147483647
-2147483648
--------------------
-2147483648
2147483647

有时候并不能符合我们的业务场景,比如队列消息从0开始增加,当增加到最大值时我们不希望下一个值为负数。而是从0开始,周而复始,对incrementAndGet和decrementAndGet分别做如下改造:

private final AtomicInteger i;
public final int incrementAndGet() {
        int current;
        int next;
        do {
            current = this.i.get();
            next = current >= 2147483647?0:current + 1;
        } while(!this.i.compareAndSet(current, next));

        return next;
    }

    public final int decrementAndGet() {
        int current;
        int next;
        do {
            current = this.i.get();
            next = current <= 0?2147483647:current - 1;
        } while(!this.i.compareAndSet(current, next));

        return next;
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 第2章 基本语法 2.1 概述 基本句法和变量 语句 JavaScript程序的执行单位为行(line),也就是一...
    悟名先生阅读 9,751评论 0 13
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,264评论 19 139
  • 为什么我们懂得了那么多道理,却仍然过不好这一生?为什么我们看了那么多书,却还是记不住? 因为读完...
    红参勿忘阅读 2,454评论 4 2
  • 进入简书的第一天,今后没事来写写东西,交一些朋友,互勉共进吧!!
    西撒赤红阅读 1,522评论 0 0
  • 黄昏时送儿子返校,回家后将卫生打扫干净,给花儿修枝,清洁花瓶,然后开始工作。其实我是个对自己经常不满意的人,事事都...
    汤蓓阅读 1,486评论 0 0

友情链接更多精彩内容