Java常用类:AtomicInteger类详解

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

作为一个稀有的Java妹子,所写的所有博客都只是当作自己的笔记,留下证据自己之前是有用心学习的~哈哈哈哈(如果有不对的地方,也请大家指出,不要悄悄咪咪的不告诉我)

AtomicInteger

AtomicInteger类是为了解决多线程下并发修改同一个变量的问题,以下例子num的值不会等于30000,总是小于30000的,因为没有做同步操作,多个线程操作同一个变量使得结果不正确。

public class AtomicIntegerDemo extends Thread{

    public static Integer num = 0;
    public void addNum(){
        num++;
    }
    @Override
    public void run() {
        for(int i=0;i<10000;i++){
            addNum();
        }
    }

    public static void main(String[] args) throws InterruptedException {
        AtomicIntegerDemo atomicIntegerDemo1 =  new AtomicIntegerDemo();
        AtomicIntegerDemo atomicIntegerDemo2 =  new AtomicIntegerDemo();
        AtomicIntegerDemo atomicIntegerDemo3 =  new AtomicIntegerDemo();
        atomicIntegerDemo1.start();
        atomicIntegerDemo2.start();
        atomicIntegerDemo3.start();
        Thread.sleep(5000);
        System.out.println(num);
    }
}

将上面的代码改为

public class AtomicIntegerDemo extends Thread{
	//使用AtomicInteger
    public static AtomicInteger num = new AtomicInteger(0);
    public void addNum(){
    	//调用incrementAndGet方法来增加num的值
        num.incrementAndGet();
    }
    @Override
    public void run() {
        for(int i=0;i<10000;i++){
            addNum();
        }
    }

    public static void main(String[] args) throws InterruptedException {
        AtomicIntegerDemo atomicIntegerDemo1 =  new AtomicIntegerDemo();
        AtomicIntegerDemo atomicIntegerDemo2 =  new AtomicIntegerDemo();
        AtomicIntegerDemo atomicIntegerDemo3 =  new AtomicIntegerDemo();
        atomicIntegerDemo1.start();
        atomicIntegerDemo2.start();
        atomicIntegerDemo3.start();
        Thread.sleep(5000);
        System.out.println(num);//30000
    }
}

源码

看下AtomicInteger类的新增变量值的方法,该方法中会一直尝试将变量+1赋值给变量,前提是线程改变后的值和期望改变后的值一致,不一致说明这时候有其他线程也在更新变量,所以就会一直尝试,直到没有竞争时才会修改成功。
public final int incrementAndGet() {
        return unsafe.getAndAddInt(this, valueOffset, 1) + 1;
    }
  public final int getAndAddInt(Object var1, long var2, int var4) {
        int var5;
        do {
            var5 = this.getIntVolatile(var1, var2);
        } while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4));

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

相关推荐

java线程-AtomicInteger原子类实现原理

上面的代码并非线程安全的,问题主要出现在count变量的不可见性和count+=1并非原子性操作,之前的解决方式都是使用Synchronized或者java sdk加锁的方式来保证原子性,使用volatile来保证可见性。在java线程-Lock详解&AQS原理详解一文中,发现大量使用了自旋+CAS操作,来保证线程安全性,这是一种无锁的操作,性能会比加锁的方式高很多。

weixin_74412978的博客 1044

JAVA学习-AtomicInteger

本文主要介绍在java实际开发过程中遇到的AtomicInteger类使用,希望可以给一些小伙伴带来帮助。AtomicInteger类是具有原子性的对于Integer进行操作工具类。它通过Unsafe保证了原子性,提供了很多对值进行比较和交换的方法,参考CAS原理。后续本文会补充上述各方法的样例代码及使用场景,尽可能的通过该类的底层实现原理更深入的理解它,同时可以学习多线程并发场景下的一些相关知识。

javaYanKang的博客 4432

【JAVA】原子类AtomicInteger与CAS原理(35)

摘要:本文介绍了Java原子类AtomicInteger及其CAS原理。AtomicInteger通过原子操作实现线程安全的整数运算,避免了同步锁的开销,适合计数器等场景(如网站访问统计)。CAS(比较并交换)是一种无锁并发机制,通过比较内存值与预期值实现原子更新,但存在ABA问题。文章通过代码示例展示了AtomicInteger在多线程任务调度和分布式锁中的应用,并对比了其与普通int的差异,同时提供了CAS的优化建议(如使用版本号解决ABA问题)。

Vinfol的博客 1726

java并发-AtomicInteger详解

本文介绍了相关的方法,通过源码很明显看出底层是通过cas+自旋实现。

大乐乐 2494

Java中的原子操作:AtomicInteger函数详解

在多线程编程中,原子操作是一种能够确保操作的完整性和一致性的操作方式。AtomicInteger为我们提供了一种线程安全的整数类型,可以进行原子操作,避免了多线程环境下的数据竞争和并发问题。通过AtomicInteger,我们可以在多线程环境下安全地进行整数的读取、写入和更新操作,避免了数据竞争和并发问题的发生。在示例代码中,我们使用了lambda表达式来定义一个简单的加法操作。除了自增和自减,AtomicInteger还提供了addAndGet()方法和getAndAdd()方法,用于原子性地加法操作。

2301_79365003的博客 791

EDEM在农业机械设计中的实战应用:以谷物收割机优化为例

本文以谷物收割机优化为例,详细阐述了EDEM离散元仿真软件在农业机械设计中的实战应用。通过构建精准的“数字谷物”模型与农机部件动态界面,利用GPU加速完成大规模颗粒系统仿真,有效诊断并解决了籽粒夹带损失与清选负荷不均等田间难题,实现了从仿真分析到田间验证的设计优化闭环。

weixin_29256771的博客 106

了解 Java 中的 AtomicInteger 类

在多线程编程中,保证数据的原子性操作是至关重要的。而 Java 提供了一系列的原子类来支持这一需求,其中之一就是。

double222222的博客 2168

手把手教你用Python+GDAL处理0.5米吉林一号卫星影像(附代码)

本文详细介绍了如何使用Python和GDAL处理吉林一号0.5米高分辨率卫星影像,包括环境配置、数据预处理、分辨率融合、植被指数计算及地物分类等关键步骤。通过实战代码示例,帮助开发者高效处理大尺寸遥感数据,解决资源崩溃和算法选择问题,提升遥感影像分析能力。

weixin_30892037的博客 126

AtomicInteger类用法实用详解

**1、**java.util.concurrent.atomic 的包里有AtomicBoolean, AtomicInteger,AtomicLong,AtomicLongArray, AtomicReference等原子类的类,主要用于在高并发环境下的高效程序处理,来帮助我们简化同步处理. 在Java语言中,++i和i++操作并不是线程安全的,在使用的时候,不可避免的会用到synchronized关键字。而AtomicInteger则通过一种线程安全的加减操作接口。 **2、**AtomicInteg

qq_44942083的博客 4661

逆向实战:从x-mini签名到RPC调用,Frida动态分析小红书加密协议

本文通过实战案例,详细拆解了小红书App的加密协议逆向分析过程。从识别x-mini签名等关键参数入手,结合静态分析与Frida动态Hook技术,追踪到核心的RPC调用入口,并最终封装成可独立调用的RPC函数,为安全研究和协议理解提供了完整的技术路径。

moss5的博客 1025

【Python爬虫教程】第3篇-解决使用reqeusts遇到的ProxyError异常

Python request代理错误提示“HTTPSConnectionPool, Cannot connect to proxy, no such file or directory”

分享技术,记录思考和感悟 1507

Java并发基础:原子类之AtomicInteger全面解析

AtomicInteger类提供了线程安全的整数操作,它通过利用底层硬件的原子性指令,能够在多线程环境中高效地实现整数的无锁更新,避免了传统同步机制带来的性能开销,在高并发场景下成为计数器可大幅提高程序的执行效率,同时又保证了数据一致性。

科技互联网领域深度探索者,乐于分享与写作。 3952

【图像去噪】论文精读:FM2S: Self-Supervised Fluorescence Microscopy Denoising With Single Noisy Image

论文题目:FM2S: Self-Supervised Fluorescence Microscopy Denoising With Single Noisy Image —— FM2S:单噪声图像自监督荧光显微镜去噪arXiv 2024!显微图像去噪!通过可视化详细的细胞结构和生物过程,荧光显微镜具有显着先进的生物学研究。然而,由于难以精确建模固有噪声和获取干净图像进行训练,这种图像去噪任务往往面临挑战,这限制了大多数现有方法。在本文中,我们提出了一种有效的。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 408

Java 原子类(AtomicInteger、CAS 原理)详解

是 Java包下的一个类,用于对整数类型的变量进行原子操作。它提供了一系列的方法,可以原子地对整数进行递增、递减、比较并交换等操作,避免了多线程环境下的数据竞争问题。是 Java 中用于实现原子操作的重要类,它基于 CAS 原理,在无锁的情况下保证了对整数变量操作的原子性,提高了并发性能。CAS 作为一种无锁算法,具有性能高、避免死锁等优点,但也存在 ABA 问题和自旋开销大等缺点。在实际开发中,需要根据具体的业务场景合理选择使用原子类和 CAS 操作,以达到最佳的性能和稳定性。

dsq_MaDing的博客 1109

TC8:IPv4_HEADER_01-04

IPv4_HEADER_01: Ensure that the DUT generates an IPv4 Packet with a Total Length greater than or equal to 20 目的 确保DUT生成的IPv4报文的IP头部中的Total Length字段值大于等于20 IPv4协议头部中的Total Length字段表示整个IP数据包的长度,包括IP Header和payload之和,IP首部的长度最少就有20个字节,所以Total Length值肯定大于等于20

jasonj333 3960

LabVIEW实现HTTP通信

本节简要介绍HTTP通信的基础知识,并以工业物联网平台TLINK中云端设备的数据发布设计为例,阐述互联网环境下HTTP客户端应用程序设计的基本方法。重点讲解工业物联网平台TLINK中HTTP设备的创建、通信数据帧的构造与测试。

不脱发的程序猿 1543

详解java并发原子类AtomicInteger

Java并发包里面的类一直是学习和面试的重点,这篇文章主要是对java并发包的其中一个类AtomicInteger的讲解。从为什么要出现AtomicInteger再到其底层原理来一个分析。 一、从a++说起为什么使用AtomicInteger 我们知道java并发机制中主要有三个特性需要我们去考虑,原子性、可见性和有序性。synchronized关键字可以保证可见性和有序性却无法保证原子性。而这...

wogoshu1的博客 421

白话讲解帕累托前沿点(Pareto Frontier)基础知识与实例解析

排除所有“劣解”,缩小决策范围;量化目标间的“权衡关系”(如“每增加1千元成本,续航提升多少小时”);支持不同场景下的个性化选择,平衡冲突目标。无论是手机选购、汽车设计,还是城市规划,帕累托前沿都是从“混乱的多目标”到“清晰的权衡”的关键桥梁,是现代决策科学中不可或缺的工具。通过数学建模,工程很多问题都可以建模成帕累托前沿求解问题,通过线性规划CPLEX、Gurobi 等优化工具,可以方便进行求解。

2137

10、java中的原子类AtomicInteger详解(基于jdk1

java并发包里面的类一直是学习和面试的重点,这篇文章主要是对java并发包的其中一个类AtomicInteger的讲解。从为什么要出现AtomicInteger再到其底层原理来一个分析。 一、从a++说起为什么使用AtomicInteger 我们知道java并发机制中主要有三个特性需要我们去考虑,原子性、可见性和有序性。synchronized关键字可以保证可见性和有序性却无法保证原子性。而这个...

冯冬冬的博客 735

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

原子操作类AtomicInteger详解

为什么需要AtomicInteger原子操作类? 对于Java中的运算操作,例如自增或自减,若没有进行额外的同步操作,在多线程环境下就是线程不安全的。num++解析为num=num+1,明显,这个操作不具备原子性,多线程并发共享这个变量时必然会出现问题。测试代码如下: public class AtomicIntegerTest { private static final int...

分享传递价值 22万+

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Java原子类 AtomicInteger

其中 CAS 算法是一种无锁同步机制,核心思想是 “先比较后更新”:它包含三个操作数 —— 内存地址 V、预期值 A、新值 B,当且仅当内存地址 V 中的值等于预期值 A 时,才将 V 的值更新为 B,否则不做任何操作,整个过程是原子性的。其中 get() 和 decrementAndGet() 都是不可被打断的原子操作,但这种写法存在明显的逻辑缺陷:虽然单个操作是原子的,但两个操作之间的间隙仍可能被其他线程打断,从而导致线程安全问题并引发票号错乱。新值 B(线程希望将内存值更新为的值)。

zjr060330的博客 720

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

AtomicInteger类下的incrementAndGet

首先要了解一下Java中的原子性的含义 Java中的原子性就是指操作不可再分,在多线程操作中,具有原子性的量,同一时刻只能有一个线程来对它进行操作。 例如a=1是原子性操作,a++和a+=1不是原子性操作 类似"a += b"这样的操作不具有原子性,在某些JVM中"a += b"可能要经过这样三个步骤: (1)取出a和b (2)计算a+b (3)将计算结果写入内存 Java中的Atomic包 Java从JDK1.5开始提供了java.util.concurrent.atomi.

zsxfa的博客 2453

AtomicInteger使用详解

AtomicInteger是Java中提供的一种线程安全的原子操作类,用于在多线程环境下对整数进行原子操作。

qq_39939541的博客 5206
上一篇: Linux:bash讲解
下一篇: Spring的AOP详解
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值