java并发JUC工具包AtomicInteger原子整型语法基础

 更新时间:2022年03月15日 10:36:40   作者:字母哥哥  
这篇文章主要为大家介绍了java并发JUC工具包AtomicInteger原子整型语法基础,有需要的朋友可以借鉴参考希望能够有所帮助,祝大家多多进步

AtomicInteger 类底层存储一个int值,并提供方法对该int值进行原子操作。AtomicInteger 作为java.util.concurrent.atomic包的一部分,从Java 1.5开始引入。

1. AtomicInteger基础用法

通过下文的AtomicInteger构造方法,可以创建一个AtomicInteger对象,该对象的初始值默认为0。AtomicInteger提供get和set方法,获取底层int整数值,与设置int整数值

//初始值为0的atomicInteger对象
AtomicInteger atomicInteger = new AtomicInteger();  
//初始值为200的atomicInteger对象
AtomicInteger atomicInteger = new AtomicInteger(200);
int currentValue = atomicInteger.get();         //100
atomicInteger.set(2453);                        //现在的值是 2453

但是上面的方法,对于AtomicInteger而言并不是它的核心内容,AtomicInteger核心内容体现在它的原子性,我们下文介绍。

2. 什么时候需要使用AtomicInteger

我们通常在以下的两种场景下使用AtomicInteger

多线程并发场景下操作一个计数器,需要保证计数器操作的原子性。

进行数值比较,如果给定值与当前值相等,进行数值的更新操作,并实现操作的非阻塞算法。

2.1. 原子计数器场景

AtomicInteger作为一个计数器使用,AtomicInteger提供了若干方法进行加法、减法的原子操作。

比如从一个map里面获取值,用get()方法,这是第一个操作;获取到值之后给这个值加上n,这是第二个操作;将进行过加法运算的值,再次放入map里面是第三个操作。所谓操作的原子性是指:在多线程并发的场景下,上面的三个操作是原子性的,也就是不可分割的。不会出现A线程get了数值,B线程同时也get到了该数值,两个线程同时为该值做运算并先后再次放入的情况,这种情况对于AtomicInteger而言是不会出现的,AtomicInteger操作是线程安全的、不可分割的。

addAndGet()- 将给定的值加到当前值上,并在加法后返回新值,并保证操作的原子性。

getAndAdd()- 将给定的值加到当前值上,并返回旧值,并保证操作的原子性。

incrementAndGet()- 将当前值增加1,并在增加后返回新值。它相当于++i操作,并保证操作的原子性。

getAndIncrement()- 将当前值增加1并返回旧值。相当于++i操作,并保证操作的原子性。

decrementAndGet()- 将当前值减去1,并在减去后返回新值,相当于i--操作,并保证操作的原子性。

getAndDecrement()- 将当前值减去1,并返回旧值。它相当于 --i操作,并保证操作的原子性。

下面是AtomicInteger原子性操作方法的例子

public class Main {
    public static void main(String[] args) {
        //初始值为100的atomic Integer
        AtomicInteger atomicInteger = new AtomicInteger(100);
        System.out.println(atomicInteger.addAndGet(2));         //加2并返回102
        System.out.println(atomicInteger);                      //102
        System.out.println(atomicInteger.getAndAdd(2));         //先获取102,再加2
        System.out.println(atomicInteger);                      //104
        System.out.println(atomicInteger.incrementAndGet());    //加1再获取105   
        System.out.println(atomicInteger);                      //105   
        System.out.println(atomicInteger.getAndIncrement());    //先获取105再加1
        System.out.println(atomicInteger);                      //106
        System.out.println(atomicInteger.decrementAndGet());    //减1再获取105
        System.out.println(atomicInteger);                      //105
        System.out.println(atomicInteger.getAndDecrement());    //先获取105,再减1
        System.out.println(atomicInteger);                      //104
    }
}

2.2. 数值比对及交换操作

compareAndSet操作将一个内存位置的内容与一个给定的值进行比较,只有当它们相同时,才会将该内存位置的内容修改为一个给定的新值。这个过程是以单个原子操作的方式完成的。

compareAndSet方法:如果当前值==预期值,则将值设置为给定的更新值。

boolean compareAndSet(int expect, int update)

expect是预期值

update是更新值

AtomicInteger compareAndSet() 方法的例子

import java.util.concurrent.atomic.AtomicInteger;
public class Main {
    public static void main(String[] args) {
        //初始值为100的atomic Integer
        AtomicInteger atomicInteger = new AtomicInteger(100);
        //当前值100 = 预期值100,所以设置atomicInteger=110
        boolean isSuccess = atomicInteger.compareAndSet(100,110);  
        System.out.println(isSuccess);      //输出结果为true表示操作成功
        //当前值110 = 预期值100?不相等,所以atomicInteger仍然等于110
        isSuccess = atomicInteger.compareAndSet(100,120);  
        System.out.println(isSuccess);      //输出结果为false表示操作失败
    }
}

3. 总结

AtomicInteger可以帮助我们在不使用synchronized同步锁的情况下,实现在多线程场景下int数值操作的线程安全,操作的原子性。并且使用AtomicInteger来实现int数值的原子操作,远比使用synchronized同步锁效率更高。

java.util.concurrent.atomic包不仅为我们提供了AtomicInteger,还提供了AtomicBoolean布尔原子操作类、AtomicLong长整型布尔原子操作类、AtomicReference对象原子操作类、AtomicIntegerArray整型数组原子操作类、AtomicLongArray长整型数组原子操作类、AtomicReferenceArray对象数组原子操作类。

以上就是java并发JUC工具包AtomicInteger原子整型语法基础的详细内容,更多关于JUC AtomicInteger原子整型语法的资料请关注脚本之家其它相关文章!

相关文章

  • 详解java 中的CAS与ABA

    详解java 中的CAS与ABA

    这篇文章主要介绍了java 中的CAS与ABA的相关资料,帮助大家更好的理解和学习使用Java,感兴趣的朋友可以了解下
    2021-05-05
  • MyBatis多对多映射初识教程

    MyBatis多对多映射初识教程

    这篇文章重点给大家介绍mybatis多对多映射,多对多映射的例子也很常见,本文通过代码实例相结合的方式给大家介绍mybatis多对多映射,需要的朋友参考下吧
    2016-08-08
  • spring boot教程之全局处理异常封装

    spring boot教程之全局处理异常封装

    这篇文章主要给大家介绍了关于spring boot教程之全局处理异常封装的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用spring boot具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-09-09
  • Java自定义类加载器实现类隔离详解

    Java自定义类加载器实现类隔离详解

    由于每种组件的不同版本所依赖的jar包不同,我们可以借鉴tomcat的实现方式,通过自定义类加载器打破双亲委派机制来实现类隔离,从而达到操作多组件多版本的目的。本文就来和大家详细聊聊实现方法
    2023-03-03
  • Spring中HandlerMethod类源码详细解析

    Spring中HandlerMethod类源码详细解析

    这篇文章主要介绍了Spring中HandlerMethod类源码详细解析,HandlerMethod类用于封装控制器方法信息,包含类信息、方法Method对象、参数、注解等信息,具体的接口请求是可以根据封装的信息调用具体的方法来执行业务逻辑,需要的朋友可以参考下
    2023-11-11
  • 基于SpringBoot实现图片上传及图片回显

    基于SpringBoot实现图片上传及图片回显

    本篇文章主要介绍了SpringBoot如何实现图片上传及图片回显,文中通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2022-08-08
  • Java解压zip文件完整代码分享

    Java解压zip文件完整代码分享

    这篇文章主要介绍了Java解压zip文件完整代码分享,向大家分享了两部分代码示例,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • SpringBoot的自定义banner使用方法

    SpringBoot的自定义banner使用方法

    这篇文章主要介绍了SpringBoot的自定义banner使用方法,在Spring Boot中,你可以通过定制Banner来个性化你的应用程序启动时的输出,Banner是一个在应用程序启动时显示的ASCII艺术字形式的标志,用于增加应用程序的识别度和个性化,需要的朋友可以参考下
    2024-01-01
  • Java StackTraceElement实例代码

    Java StackTraceElement实例代码

    这篇文章主要介绍了Java StackTraceElement实例代码,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-02-02
  • maven项目如何依赖自定jar包

    maven项目如何依赖自定jar包

    这篇文章主要介绍了maven项目如何依赖自定jar包,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02

最新评论