• AtomicInteger详解


    一、什么是AtomicInteger

    AtomicInteger类是系统底层保护的int类型,通过对int类型的数据进行封装,提供执行方法的控制进行值的原子操作。AtomicInteger它不能当作Integer来使用

    从JAVA 1.5开始,AtomicInteger 属于java.util.concurrent.atomic 包下的一个类

    二、AtomicInteger的作用

    在Java中的运算操作,例如自增或自减,在多线程环境下就是线程不安全的。num++解析为num=num+1,Java程序会把算式分为3个操作,获取值,计算值,赋予值,明显,这个操作不具备原子性,多线程并发共享这个变量时必然会出现问题。
    一个线程计算出值后,还未重新给变量赋值,另一个线程有来读取到这个值,就会造成线程不安全的问题。
    想让线程安全,往往可能需要通过加锁的方式去保证线程安全,但是,加锁对性能会有很大的影响。
    而AtomicInteger原子类型就是让程序在不加锁的时候也能保障线程安全,案例如下:

    
      static int b =0;
       public static void main(String[] args) throws InterruptedException {
    
           AtomicInteger a = new AtomicInteger(0);
            Thread t1 = new Thread(new Runnable() {
                @Override
                public void run() {
                    for (int i = 0; i < 10000; i++) {
                        a.incrementAndGet();
                       b++;
                    }
                    
                }
            });
            t1.start();
           Thread t2 = new Thread(new Runnable() {
               @Override
               public void run() {
                   for (int i = 0; i < 10000; i++) {
                       a.incrementAndGet();
                       b++;
                   }
               }
           });
           t2.start();
            Thread.sleep(1000);
           System.out.println("a="+a);
           System.out.println("b="+b);
       }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    输出结果:
    image.png
    根据结果可见,使用AtomicInteger在多线程进行自增运算的时候,是线程安全的,而普通的int在自增的时候则是线程不安全的。

    incrementAndGet()方法,是AtomicInteger的自增方法,会让AtomicInteger的值+1。

    三、 原子方式执行加法和减法操作的方法

    • addAndGet()- 以原子方式将给定值添加到当前值,并在添加后返回新值。
    • getAndAdd() - 以原子方式将给定值添加到当前值并返回旧值。
    • incrementAndGet()- 以原子方式将当前值递增1并在递增后返回新值。它相当于i ++操作。
    • getAndIncrement() - 以原子方式递增当前值并返回旧值。它相当于++ i操作。
    • decrementAndGet()- 原子地将当前值减1并在减量后返回新值。它等同于i-操作。
    • getAndDecrement() - 以原子方式递减当前值并返回旧值。它相当于-i操作。
  • 相关阅读:
    这才是真正的Spring全家桶:Spring+SpringData+MVC+Boot+Cloud
    氨基酸代谢:从基础到应用,揭示其在健康与疾病的角色
    计算机辅助药物设计- - 从蛋白质结构到药物候选物的全方位实战
    科研项目一般流程介绍
    拼多多快捷回复语
    数据库自增ID用完了会怎么样?
    linux下安装ffmpeg的教程
    web前端期末大作业 HTML+CSS+JavaScript仿京东
    SpringCloud微服务之sentinel实现降级全流程
    cesium 实战记录(一) 底图动态配置,前端实现切换
  • 原文地址:https://blog.csdn.net/qq_45171957/article/details/126079141