AtomicInteger理解和使用

AtomicInteger详解 AtomicInteger类是系统底层保护的int类型,通过对int类型的数据进行封装,提供执行方法的控制进行值的原子操作。AtomicInteger它不能当作Integer来使用从JAVA1.5开始,AtomicInteger属于java.util.concurrent.atomic包下的一个类。... 阅读详情

AtomicInteger类的理解与使用

首先看两段代码,一段是Integer的,一段是AtomicInteger的,为以下:

public class Sample1 {

    private static Integer count = 0;

    synchronized public static void increment() {
        count++;
    }

}

以下是AtomicInteger的:

public class Sample2 {

    private static AtomicInteger count = new AtomicInteger(0);

    public static void increment() {
        count.getAndIncrement();
    }

}

以上两段代码,在使用Integer的时候,必须加上synchronized保证不会出现并发线程同时访问的情况,而在AtomicInteger中却不用加上synchronized,在这里AtomicInteger是提供原子操作的,下面就对这进行相应的介绍。


AtomicInteger介绍

AtomicInteger是一个提供原子操作的Integer类,通过线程安全的方式操作加减。


AtomicInteger使用场景

AtomicInteger提供原子操作来进行Integer的使用,因此十分适合高并发情况下的使用。


AtomicInteger源码部分讲解

public class AtomicInteger extends Number implements java.io.Serializable {
    private static final long serialVersionUID = 6214790243416807050L;

    // setup to use Unsafe.compareAndSwapInt for updates
    private static final Unsafe unsafe = Unsafe.getUnsafe();
    private static final long valueOffset;

    static {
        try {
            valueOffset = unsafe.objectFieldOffset
                (AtomicInteger.class.getDeclaredField("value"));
        } catch (Exception ex) { throw new Error(ex); }
    }

    private volatile int value;

以上为AtomicInteger中的部分源码,在这里说下其中的value,这里value使用了volatile关键字,volatile在这里可以做到的作用是使得多个线程可以共享变量,但是问题在于使用volatile将使得VM优化失去作用,导致效率较低,所以要在必要的时候使用,因此AtomicInteger类不要随意使用,要在使用场景下使用。


AtomicInteger实例使用

以下就是在多线程情况下,使用AtomicInteger的一个实例,这段代码是借用IT宅中的一段代码。

  public class AtomicTest {

    static long randomTime() {
        return (long) (Math.random() * 1000);
    }

    public static void main(String[] args) {
        // 阻塞队列,能容纳100个文件
        final BlockingQueue<File> queue = new LinkedBlockingQueue<File>(100);
        // 线程池
        final ExecutorService exec = Executors.newFixedThreadPool(5);
        final File root = new File("D:\\ISO");
        // 完成标志
        final File exitFile = new File("");
        // 原子整型,读个数
        // AtomicInteger可以在并发情况下达到原子化更新,避免使用了synchronized,而且性能非常高。
        final AtomicInteger rc = new AtomicInteger();
        // 原子整型,写个数
        final AtomicInteger wc = new AtomicInteger();
        // 读线程
        Runnable read = new Runnable() {
            public void run() {
                scanFile(root);
                scanFile(exitFile);
            }

            public void scanFile(File file) {
                if (file.isDirectory()) {
                    File[] files = file.listFiles(new FileFilter() {
                        public boolean accept(File pathname) {
                            return pathname.isDirectory() || pathname.getPath().endsWith(".iso");
                        }
                    });
                    for (File one : files)
                        scanFile(one);
                } else {
                    try {
                        // 原子整型的incrementAndGet方法,以原子方式将当前值加 1,返回更新的值
                        int index = rc.incrementAndGet();
                        System.out.println("Read0: " + index + " " + file.getPath());
                        // 添加到阻塞队列中
                        queue.put(file);
                    } catch (InterruptedException e) {

                    }
                }
            }
        };
        // submit方法提交一个 Runnable 任务用于执行,并返回一个表示该任务的 Future。
        exec.submit(read);

        // 四个写线程
        for (int index = 0; index < 4; index++) {
            // write thread
            final int num = index;
            Runnable write = new Runnable() {
                String threadName = "Write" + num;

                public void run() {
                    while (true) {
                        try {
                            Thread.sleep(randomTime());
                            // 原子整型的incrementAndGet方法,以原子方式将当前值加 1,返回更新的值
                            int index = wc.incrementAndGet();
                            // 获取并移除此队列的头部,在元素变得可用之前一直等待(如果有必要)。
                            File file = queue.take();
                            // 队列已经无对象
                            if (file == exitFile) {
                                // 再次添加"标志",以让其他线程正常退出
                                queue.put(exitFile);
                                break;
                            }
                            System.out.println(threadName + ": " + index + " " + file.getPath());
                        } catch (InterruptedException e) {
                        }
                    }
                }

            };
            exec.submit(write);
        }
        exec.shutdown();
    }

}


AtomicInteger使用总结

AtomicInteger是在使用非阻塞算法实现并发控制,在一些高并发程序中非常适合,但并不能每一种场景都适合,不同场景要使用使用不同的数值类。

【Java原理系列】 AtomicInteger原理用法源码详解 `AtomicInteger` 的原理基于 CAS(Compare-And-Swap)操作。它内部使用了 `Unsafe` 类或者其他底层的原子操作机制来实现线程安全的操作。 阅读详情

相关推荐

【项目实战】并发编程之AtomicInteger入门介绍

AtomicInteger是一种原子类型的数据结构,它可以用于实现并发编程中的原子操作。原子操作是指一个操作在执行过程中不会被其他线程干扰,要么完全执行成功,要么完全不执行。

奶爸的编程之路,也就一周冷个三天 1484

java学习之 AtomicInteger 的用法和实现原理详解

i++ 不是线程安全的操作,因为它不是一个原子性操作。那么,如果我想要达到类似 i++ 的这种效果,我应该使用哪些集合或者说工具类呢?在 JDK1.5 之前,为了确保在多线程下对某基本数据类型或者引用数据类型运算的原子性,必须依赖于外部关键字,但是这种情况在 JDK1.5 之后发生了改观,当然你依然可以使用 synchronized 来保证原子性,我们这里所说的一种线程安全的方式是原子性的工具类,比如等。这些原子类都是线程安全的工具类,他们同时也是Lock-Free的。

白话机器学习 5502

【计算机科学导论实验】加法图灵机模拟 题解

本文提供计算机科学导论课程“图灵机加法器”实验的个人思路,仅供参考。

Chavapa's blog 2579

对 AtomicInteger 源码 的理解

java.util.concurrent.atomic 包提供了若干个类能实现对int,long,boolean,reference的几个特殊方法非阻塞原子性,这一系列类的主要基于以下两点 1.volatile修饰变量,保证get()/set()的原子性 2.利用系统底层的CAS原语来实现非阻塞的其它方法原子操作    private volatile int value;

bingjing12345的专栏 4374

手把手教你用VMware虚拟机搭建PCAN开发环境:从Ubuntu安装到CAN通讯实战

本文详细指导如何在VMware虚拟机中搭建PCAN开发环境,涵盖从Ubuntu系统安装、VMware精细配置、PCAN-USB设备直通,到Linux驱动编译、can-utils工具集使用及完整CAN通讯测试的全过程。通过实战步骤与故障排查技巧,帮助开发者快速构建稳定高效的CAN总线开发与测试沙盒,特别适合车载诊断与嵌入式通讯应用。

weixin_29216353的博客 225

【Xilinx】如何在petalinux下编译vcu-gst-app以及独立编译vcu-gst-app

Xilinx从2018.1开始,提供了一套基于zcu106的vcu参考设计。里面提供了一套基于GStreamer的程序,即vcu-gst-app。如何脱离petalinux直接编译呢,这里以为例,其他版本也是类似的操作。

王师傅 3041

AtomicInteger类的理解与使用

AtomicInteger类的理解与使用 首先看两段代码,一段是Integer的,一段是AtomicInteger的,为以下: public class Sample1 { private static Integer count = 0; synchronized public static void increment() { count++; ...

songhuanfeng的博客 379

W25N01GV SPI NAND Flash驱动开发避坑指南:详解2KB缓冲区机制与状态寄存器正确用法

本文深入解析W25N01GV SPI NAND Flash芯片的2KB缓冲区机制与状态寄存器正确用法,提供STM32 HAL和ESP-IDF项目的实战解决方案。涵盖双阶段操作原理、状态寄存器深度解析、时序控制优化及跨平台驱动设计要点,帮助开发者避免常见错误并提升存储性能。

aizhouqian5537的博客 640

AtomicInteger 类的理解与使用

AtomicInteger 类的理解与使用 首先看两段代码,一段是Integer的,一段是AtomicInteger的,为以下: public class Sample1 { private static Integer count = 0; synchronized public static void increment() { count++;

yushengjun_644的博客 333

SAP FI实战入门:从借贷法则到F-02记账,新手必懂的会计凭证操作

本文详细介绍了SAP FI模块中借贷记账法的核心逻辑及F-02凭证录入的全流程操作。通过实例解析借贷方向规则、科目编码设置及金额镜像原则,帮助新手快速掌握会计凭证操作技巧。同时提供了FS10N余额查询和常见错误排查方法,助力用户高效完成SAP财务记账任务。

weixin_29306571的博客 263

Qt入门教程100篇(已完结)

Qt5入门教程,Qt6入门教程。包含了: Qt环境搭建篇、Qt数据类型篇、Qt中STL篇、Qt核心篇、Qt核心对象QObject篇、Qt基础控件篇、Qt对话框篇、Qt高级控件篇、Qt数据模型篇、QSS篇、Qt文件篇 、Qt硬件编程、Qt的一些demo、Qt项目开发篇。......

小鱼酱的博客 15万+

谈谈你对AtomicInteger的理解

AtomicInteger是一个提供原子操作的Integer类,通过线程安全的方式操作加减。十分适合高并发情况下的使用   对于全局变量的数值类型操作 num++,若没有加synchronized关键字则是线程不安全的,num++解析为num=num+1,明显,这个操作不具备原子性,多线程时必然会出现问题。测试下: 输出的结果为count: 9992,这个值不定,每次测试都可能不一样,很...

不羁朔风的博客 6118

基于ENVI完成影像的去云操作以及后续处理

利用ENVI完成重采样影像的去云操作 由于SNAP重采样之后的影像是分波段保存的,ENVI的波段运算工具一次也只能输出一个波段,所以去云的操作分波段进行,原理是掩膜法 下面是打开所有波段后的界面 去云的依据是以quality_scene_classification栅格文件为基础,该文件是哨兵2数据自带的场景质量分类图,包含12个级别,可以通过SNAP软件查看,如下图所示: 对于去云操作而言,我们只需要DARK_FEATURE_SHADOW(地形等),CLOUD_SHADOW(云阴影)、CL

lemon_tttea的博客 2万+

AtomicInteger深入理解

高并发的情况下,i++无法保证原子性,往往会出现问题,所以引入AtomicInteger类。

justlpf的专栏 496

CGAL 网格等高线计算

CGAL 网格等高线计算

dayuhaitang1的博客 452

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

对AtomicInteger的理解

本文通过两个测试案例比较了使用AtomicInteger和普通int变量在多线程环境下的线程安全问题。第一个测试使用AtomicInteger的原子操作方法实现了线程安全的库存扣减操作,能准确反映最终库存;第二个测试直接使用普通int变量进行自减操作,由于非原子性操作导致线程不安全,最终库存结果不准确。实验结果表明,在多线程环境下应使用原子类AtomicInteger来保证线程安全,避免出现数据不一致问题。

sync_with_U 141

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

volatile和atomicInteger的区别理解特性

volatile和atomicInteger的理解

水镜先生的博客 4542

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Java AtomicInteger 学习以及理解

然而,这个类确实扩展了{@code Number},允许处理基于数值的类的工具和实用程序进行统一访问。这个类在我看来实现了一个数字自增和自减的一个类,由于有初始的创建值,因此如果不做其他处理额外处理的话,每次重新启动那么这个初始值都会被初始化,重新递增。经过一些资料的查询和确认,该类更多的是用在多线程场景,或校验保证操作的原子性,原子性,即唯一一个,保证只有一个可操作对象。否则不予赋值,返回是否一致的 布尔值。在实际使用时可能有多个这个样的计数器,例如JDK 内部对线程的生成名做区别则如下使用。

weixin_44131922的博客 1019

AtomicInteger 理解

查看连接池源码时看到了AtomicInteger,在多线程为了保存数据的一致性必须通过锁方式实现 AtomicInteger 主要通过 volatile 关键字在多线程中可以保证数据的原子性,但随之效率也会降低 测试用例,直接COPY运行 package com.hhly.sns.commons; import java.util.concurrent.atomic.AtomicInt

javaee_ssh的专栏 423

深入理解AtomicInteger

AtomicInteger类是jdk并发包下的一个原子操作类,顾名思义原子操作类就是实现变量的原子操作的,要深刻理解这个类的作用我们要先从i++这个操作说起。 情景假设:商城后台需要录入库存,现在商品A剩下0个库存,仓库管理员A点击添加按钮添加一个库存,仓库管理员B点击添加按钮添加一个库存。代码如下: public class Product{ private int i; Pro

悟 680
上一篇: HttpClient请求时connectionRequestTimeout 、connectionTimeout、socketTimeout三个超时时间的含义
下一篇: 深入理解Lock
光与热
博客等级 码龄11年 55粉丝 126原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值