JAVA学习-AtomicInteger

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

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

本文主要介绍在java实际开发过程中遇到的AtomicInteger类使用,希望可以给一些小伙伴带来帮助。

一、AtomicInteger是什么?

AtomicInteger是Java中提供的对Integer进行原子操作的类,使用场景为多线程并发场景。但不能代替传统Integer使用。说到并发场景大家首先会考虑其“原子性”、“可见性”和“有序性”;

    “原子性”:对于该特性最通俗的解释为一个操作要具有原子性。那么什么为原子操作呢?我认为可以从上学期间的生物知识进行切入,在生物学中“原子”是不能够再被切分的单元。因此原子操作就可以理解为:不能够再被切分的操作。例如:我们定义一个x并初始化值为0,则有x = 0;同样的例子:x--也可以写作x=x-1;此操作分为两步:先将x进行减法操作然后将值再赋于原x。“非原子性”带来的就是非线性安全问题。那么大家可能会想到一个关键字:synchronized,该关键字只能保证可见性和有序性。

  “可见性”:当一个线程A修改了共享变量时,另外线程B可以读取修改后的结果。例如日常开发过程中常用的“volatile”关键字,用此关键字修饰的变量修改后可以直接修改内存,因此其他线程可以马上拿到修改后的结果。

  “有序性”:跟其名词含义一样,程序可以按照代码顺序进行执行。那么问题来了:为什么程序会不按照代码顺序执行呢?因为JVM在执行代码时为了提高执行效率会进行指令重排序。

二、AtomicInteger相关方法

         下面咱们介绍AtomicInteger主要使用的一些方法,在介绍方法前先通过其源代码进行学习,如下图:

通过上图可以直观的看到: AtomicInteger类继承Number类同时实现Serializable接口;同时它包含了三个属性:Unsafe,Unsafe的objectFieldOffset方法获取的VALUE值和value;

   Unsafe: 该属性保证了操作的原子性。

   Unsafe的objectFieldOffset方法: 找到成员属性在内存中的地址。

    value:就是上述方法的值。

1.addAndGet()

    方法解释:以原子方式将给定值添加到当前值,并在添加后返回新值。其实是使用了CAS原理进行了自旋操作。

      

2.getAndAdd()

   方法解释:以原子方式将给定值添加到当前值并返回旧值。

3.incrementAndGet()

   方法解释:以原子方式将当前值递增1并在递增后返回新值。它相当于i ++操作。

4.getAndIncrement()

   方法解释:以原子方式递增当前值并返回旧值。它相当于++ i操作。

5.decrementAndGet()

   方法解释:原子地将当前值减1并在减量后返回新值。它等同于i-操作。

6.getAndDecrement()

   方法解释:以原子方式递减当前值并返回旧值。它相当于-i操作。


总结

AtomicInteger类是具有原子性的对于Integer进行操作工具类。它通过Unsafe保证了原子性,提供了很多对值进行比较和交换的方法,参考CAS原理。

后续本文会补充上述各方法的样例代码及使用场景,尽可能的通过该类的底层实现原理更深入的理解它,同时可以学习多线程并发场景下的一些相关知识。

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

相关推荐

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

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

Vinfol的博客 1726

AtomicInteger详解

AtomicInteger详解

文章若能帮助到你,欢迎关注谢谢大家 3万+

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

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

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

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

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

白话机器学习 5502

深入解析:如何在Visual Studio中高效编译libredwg与libdxfrw

本文详细介绍了在Visual Studio中高效编译libredwg与libdxfrw的完整流程,包括环境配置、源码获取、CMake技巧及常见错误解决方案。针对CAD开发者,提供了从基础编译到项目集成的实用指南,帮助快速处理DWG/DXF文件,提升开发效率。

weixin_29215391的博客 232

基于ASP.NET+SQLServer的美妆网站的设计与实现

通过本次ASP.NET MVC美妆商城项目的开发,我们实现了一个功能完善、性能稳定的在线购物平台。该项目不仅提升了用户的购物体验,也为商家提供了一个高效的商品管理和销售渠道。未来,我们将持续优化系统功能,提升用户体验,以适应不断变化的市场需求。

毕业设计大牛哥 1497

Java AtomicInteger 学习以及理解

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

weixin_44131922的博客 1018

NE5532A与JRC4580在低噪声音频电路设计中的关键应用

本文深入探讨了经典运算放大器NE5532A与JRC4580在低噪声音频电路设计中的核心应用。文章从噪声模型分析入手,阐述了针对低阻抗信号源时,如何利用这两款BJT输入运放的低电流噪声特性进行优化设计。通过对比两者参数与实战守则,为设计高保真音频前级、耳机放大等电路提供了从原理图到PCB布局的完整低噪声解决方案。

weixin_29295541的博客 326

深入学习java源码之AtomicInteger.get()与AtomicInteger.incrementAndGet()

  深入学习java源码之AtomicInteger.get()与AtomicInteger.incrementAndGet() 为什么需要AtomicInteger原子操作类? 对于Java中的运算操作,例如自增或自减,若没有进行额外的同步操作,在多线程环境下就是线程不安全的。num++解析为num=num+1,明显,这个操作不具备原子性,多线程并发共享这个变量时必然会出现问题。 pu...

悦分享 6162

CTF命令执行绕过实战:从空格过滤到无回显外带的7种核心姿势

命令执行漏洞是Web安全中的常见高危漏洞,其核心原理在于应用程序未对用户输入进行充分过滤,导致攻击者能够注入并执行系统命令。在真实环境中,安全防护措施(如WAF、输入过滤函数)普遍存在,因此漏洞利用的关键技术在于“绕过”这些过滤机制。理解过滤器的运作逻辑(如黑名单、白名单、转义、长度限制)是成功绕过的前提。通过系统学习**空格绕过**、**命令黑名单绕过**、**编码混淆**等基础技巧,并结合**无回显外带**、**反弹Shell**等高级利用链,安全研究人员能够有效应对复杂防护场景。本文以CTFshow

weixin_29315091的博客 368

电磁波函数复数表示法:为什么物理学家偏爱e^(ikz)而非cos(kr-wt)?

本文深入解析了电磁波函数复数表示法(如e^(ikz))相较于传统余弦形式的巨大优势。通过欧拉公式,复数形式将复杂的三角运算转化为简洁的指数运算,在微分、积分、线性叠加及处理相位时展现出极高的计算效率,是物理学家和工程师分析波动现象的核心工具。

weixin_29094539的博客 498

java AtomicInteger 类学习

AtomicInteger,一个提供原子操作的Integer的类。在Java语言中,++i和i++操作并不是线程安全的,因为他们并不属于原子操作。在使用的时候,不可避免的会用到synchronized关键字。而AtomicInteger则通过一种线程安全的加减操作接口。 AtomicInteger提供的接口有: //获取当前的值 public final int get() /

mmggcc的专栏 1059

Vivado安装教程:多版本共存的配置技巧

详解Vivado安装教程中的多版本共存配置技巧,帮助用户在同一系统中管理不同版本的Vivado开发环境,提升开发效率与兼容性,适用于需要切换版本的FPGA开发者。

weixin_35257663的博客 1768

java 学习笔记之AtomicInteger类的使用

今天在看源码的时候看到了一个类叫AtomicInteger,所以决定探索一番。 从源码中看出,AtomicInteger继承自Number类,值得注意的是其中的value属性是用volatile关键字修饰的,这个关键字在java 1.5之前经常容易引发一些意想不到的错误,之后得到了优化,才得以重生。这里先简单的说下volatile关键字吧,被其修饰的变量当线程前来访问的时候,会去读取该变量被

moonfish0607的博客 361

LVI-SAM适配KITTI数据集避坑指南:IMU频率与数据同步问题解析

本文深入解析了将LVI-SAM框架适配KITTI数据集时,在IMU频率与多传感器数据同步方面遇到的核心挑战与解决方案。针对KITTI数据集中sync与extract两种数据包的差异,文章提供了从数据选择、参数调优到时间戳诊断与修复的完整避坑指南,帮助开发者实现稳定高效的SLAM系统部署。

7z8x2c4v6b9的博客 247

智能车新手必看:如何用PID和差速转弯让小车跑得更稳(附代码示例)

本文详细介绍了智能车控制系统中PID算法和差速转弯的实现方法,包括位置式与增量式PID的选择、参数整定技巧以及编码器反馈的关键作用。通过代码示例和实战经验,帮助新手快速掌握智能车稳定行驶的核心技术,提升赛道表现。

mmm90的博客 122

JAVA学习-AtomicInteger(亲测)

java中Integer自增

gb4215287的博客 324

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

java源码学习(java-src)之AtomicInteger

如果以下内容有错误或者您有不同的见解,请关注我。想要思维导图的小伙伴们记得留言哦。 项目源码以及脑图链接地址:《https://mp.weixin.qq.com/s/V5gfnOBYQJw_6lvmi1oQSQ》 /** * An {@code int} value that may be updated atomically. See the * {@link VarHandle} specification for descriptions of the properties *

oMengQiQi1的博客 220

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

integer java关键字_java 学习笔记之AtomicInteger类的使用

今天在看源码的时候看到了一个类叫AtomicInteger,所以决定探索一番。从源码中看出,AtomicInteger继承自Number类,值得注意的是其中的value属性是用volatile关键字修饰的,这个关键字在java 1.5之前经常容易引发一些意想不到的错误,之后得到了优化,才得以重生。这里先简单的说下volatile关键字吧,被其修饰的变量当线程前来访问的时候,会去读取该变量被修改后的...

weixin_33840959的博客 208

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Java automicinteger_Java中AtomicInteger的使用!!!

今天在看Volley的源码的时候,看到里面使用了AtomicInteger这个类,曾经没用过,今天看了一下API学习了一下:首先介绍一下这个类的用处,这个类主要是用来替换java中的自增和自减操作,也就是i++和++i等这个运算,为什么要使用这个类了,主要是由于i++和i--等运算是线程不安全的,所以就须要这个类来替换,接下来不多说,直接上代码,看不懂的能够參照帮助文档:public class ...

weixin_39787628的博客 834

Java并发学习之AtomicInteger AtomicLong AtomicBoolean

AtomicXXX具体怎么实现的呢?volatile的基本数据类型+CAS操作。volatile保证可见性,当一个线程修改volatile变量时,其他线程拿到的都是修改后的最新值。里面的方法都是对Unsafe方法的封装,而Unsafe里面的方法都是JNI方法,通过调用底层c++方法从而实现指令级的原子操作。AtomicInteger count=new AtomicInteger(...

weixin_30765475的博客 206

Java并发学习笔记(九)-原子类AtomicInteger

AtomicInteger能够保证对一个整型的操作是原子性。像i++这个操作不是原子操作,存在竞态条件,所以需要加锁,但是加锁的性能不高,如果仅仅为了对一个整数加1。我们来看下他的实现。 private volatile int value; AtomicInteger本身持有一个整型变量,所有的操作都是基于这个变量的。变量由violate修饰,这个变量是保证可见性的,具体可见另一

ltnb的专栏 1092

源码学习【原子类AtomicInteger】Java原子类底层实现(解释详细)

原子类AtomicInteger 在Java中,有很多方法可以保证多线程下数据的安全,AtomicXXXX这些类就是其中的一种,原子类,可以保证每一步操作都是原子操作。这次就对AtomicInteger的源码进行学习。 首先看一下这个类的类变量和成员变量: //类变量 unsafe类【java不能直接访问操作系统底层,而是通过本地方法来访问。Unsafe类提供了硬件级别的原子操作】 //这里...

一个想写小说的程序员 1273

Java源码学习--并发量06--01--AtomicInteger

AtomicInteger 一、结构 实现了Number抽象类,定义了一些默认方法 public abstract class Number implements java.io.Serializable { public abstract int intValue(); public abstract long longValue(); public abstract...

学来所记,记来所思,思来所写 174

Java并发学习(七)-AtomicInteger基本数据类型类

从Java5开始,出现了concurrent并发包,这里主要先介绍atomic包下面的AtomicXXX诸如AtomicBoolean,AtomicInteger,AtomicLong等原子更新类,它们内部实现思想基本一致,这里以AtomicInteger为例进行介绍。 AtomicXXX主要包括:AtomicInteger,AtomicBoolean,AtomicLong,AtomicRefer

anLA_的专栏 1409
上一篇: GIT代码管理-SourceTree工具
下一篇: RestFul API接口
JACK YANK
博客等级 码龄9年 0粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值