当前位置: 首页 > news >正文

AtomicInteger

        AtomicInteger 是 Java 并发包 (java.util.concurrent.atomic) 中的一个原子类,用于在多线程环境下对整数进行原子操作。

核心特性

原子性

提供线程安全的原子操作(如自增、加法、比较并交换等),确保在多线程环境中操作不会被中断,避免数据竞争。

无锁机制

基于 CAS(Compare-And-Swap) 实现,通过 CPU 指令直接支持无锁并发,减少线程阻塞,提升性能。

内存可见性

内部使用 volatile 修饰的 int 值,保证修改的可见性,写操作立即对其他线程可见。

常用方法 

方法描述
int get()获取当前值。
void set(int newValue)设置新值。
int getAndIncrement()相当于 i++,返回旧值。
int incrementAndGet()相当于 ++i,返回新值。
int getAndAdd(int delta)原子地加上 delta,返回旧值。
int addAndGet(int delta)原子地加上 delta,返回新值。
boolean compareAndSet(int expect, int update)如果当前值等于 expect,则设置为 update,返回是否成功。
int updateAndGet(IntUnaryOperator updateFunction)应用函数更新值,返回新值。例如:x -> x * 2

底层实现

  • CAS 操作:通过 Unsafe 类调用底层 CAS 指令(如 compareAndSwapInt),在循环中不断尝试更新,直到成功。

  • volatile 变量:内部值 private volatile int value 保证可见性。

AtomicInteger 是轻量级的线程安全整数操作类,适用于单变量的原子更新场景。 

import java.util.concurrent.atomic.AtomicInteger;public class ThreadSafe {static int a = 0;public static void main(String[] args) throws InterruptedException {AtomicInteger b = new AtomicInteger(0);Thread thread1 = new Thread(new Runnable() {@Overridepublic void run() {for(int i=0;i<1000;i++){a++;b.incrementAndGet();}}});Thread thread2 = new Thread(new Runnable() {@Overridepublic void run() {for(int i=0;i<1000;i++){a++;b.incrementAndGet();}}});thread1.start();thread2.start();//等待thread1与thread2执行完毕Thread.sleep(1000);System.out.println(a);//1824System.out.println(b);//2000}
}

 从代码的执行结果可以看到,int类型是线程不安全的,而AtomicInteger类型则是完全线程安全的。

推荐使用AtomicInteger:1114. 按序打印 - 力扣(LeetCode)

http://www.xdnf.cn/news/499681.html

相关文章:

  • Axure制作可视化大屏动态滚动列表教程
  • 2025 年九江市第二十三届中职学校技能大赛 (网络安全)赛项竞赛样题
  • Seata源码—5.全局事务的创建与返回处理一
  • 由浮点数x的位级表示求其整型值
  • MySQL UPDATE 执行流程全解析
  • 【开源Agent框架】Suna架构设计深度解析与应用实践
  • Spring源码之解决循环依赖 三级缓存
  • UDP--DDR--SFP,FPGA实现之模块梳理及AXI读写DDR读写上板测试
  • 【离散化 线段树】P3740 [HAOI2014] 贴海报|普及+
  • Web安全基础:深度解析与实战指南
  • langchain—chatchat
  • 【AI】SpringAI 第二弹:基于多模型实现流式输出
  • 江协科技GPIO输入输出hal库实现
  • QT+Visual Studio 配置开发环境教程
  • Python异常模块和包
  • Oracle 高水位线(High Water Mark, HWM)
  • 自定义库模块增加自定义许可操作详细方法
  • c++动态链接库
  • 04_决策树
  • MySQL只操作同一条记录也会死锁吗?
  • 支持selenium的chrome driver更新到136.0.7103.94
  • 【Java ee初阶】HTTP(2)
  • 【MySQL】第五弹——表的CRUD进阶(三)聚合查询(上)
  • Docker数据卷
  • 深入解析Spring Boot与JUnit 5的集成测试实践
  • FTP服务搭建实战:安全文件共享解决方案
  • 使用Docker部署Nacos
  • 机器学习-人与机器生数据的区分模型测试 -数据筛选
  • 【AI论文】EnerVerse-AC:用行动条件来构想具身环境
  • stm32 DMA