iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >java并发JUC工具包AtomicInteger原子整型语法的示例分析
  • 330
分享到

java并发JUC工具包AtomicInteger原子整型语法的示例分析

2023-06-29 12:06:18 330人浏览 薄情痞子
摘要

这篇文章主要介绍了java并发JUC工具包AtomicInteger原子整型语法的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。AtomicInteger 类底层存储

这篇文章主要介绍了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();         //100atomicInteger.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原子整型语法的示例分析”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网精选频道,更多相关知识等着你来学习!

    --结束END--

    本文标题: java并发JUC工具包AtomicInteger原子整型语法的示例分析

    本文链接: https://www.lsjlt.com/news/324782.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    本篇文章演示代码以及资料文档资料下载

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档
    猜你喜欢
    • java并发JUC工具包AtomicInteger原子整型语法的示例分析
      这篇文章主要介绍了java并发JUC工具包AtomicInteger原子整型语法的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。AtomicInteger 类底层存储...
      99+
      2023-06-29
    • java并发JUC工具包AtomicInteger原子整型语法基础
      目录1. AtomicInteger基础用法2. 什么时候需要使用AtomicInteger2.1. 原子计数器场景2.2. 数值比对及交换操作3. 总结AtomicInteger ...
      99+
      2024-04-02
    • java并发编程工具类JUC之LinkedBlockingQueue链表队列的示例分析
      小编给大家分享一下java并发编程工具类JUC之LinkedBlockingQueue链表队列的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!java.u...
      99+
      2023-06-15
    • java并发包JUC同步器框架AQS的示例分析
      小编给大家分享一下java并发包JUC同步器框架AQS的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1. 背景介绍通过JCP的JSR166规范,Java...
      99+
      2023-06-29
    • java并发编程包JUC线程同步CyclicBarrier语法示例
      目录1.创建CyclicBarrier障碍2.在CyclicBarrier障碍处等待3.CyclicBarrierAction4.CyclicBarrier例子在之前的文章中已经为大...
      99+
      2024-04-02
    • Java并发中AQS原理的示例分析
      这篇文章给大家分享的是有关Java并发中AQS原理的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。线程阻塞原语Java 的线程阻塞和唤醒是通过 Unsafe 类的 park 和 unpark 方法做到的。...
      99+
      2023-06-02
    • Java多线程Atomic包操作原子变量与原子类的示例分析
      这篇文章主要介绍Java多线程Atomic包操作原子变量与原子类的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、何谓Atomic?Atomic一词跟原子有点关系,后者曾被人认为是最小物质的单位。计算机中的...
      99+
      2023-05-30
      java
    • Go语言中并发goroutine底层原理的示例分析
      小编给大家分享一下Go语言中并发goroutine底层原理的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!一、基本概念①并发、并行区分1.概念并发:同一时间段内一个对象执行多个任务,充分利用时间并行:同一时刻,多个...
      99+
      2023-06-29
    • Java日期操作方法工具类的示例分析
      这篇文章将为大家详细讲解有关Java日期操作方法工具类的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。本文实例讲述了Java日期操作方法工具类,具体如下:package com.gclo...
      99+
      2023-05-30
      java
    • java并发中DelayQueue延迟队列原理的示例分析
      这篇文章给大家分享的是有关java并发中DelayQueue延迟队列原理的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。介绍DelayQueue队列是一个延迟队列,DelayQueue中存放的元素必须实现...
      99+
      2023-06-15
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作