当前位置: 首页 > 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.dtcms.com/a/196140.html

相关文章:

  • 信息收集+初步漏洞打点
  • springboot配置tomcat端口的方法
  • 单细胞转录组(3)
  • DAY28-类的定义和方法
  • 深入解析Spring Boot与Spring Security的集成实践
  • 无线数传模块支持园区多节点电力参数同步监测配置指南
  • Java 注解篇:@RequestMapping
  • 大模型技术演进与应用场景深度解析
  • LVGL- Calendar 日历控件
  • 联想笔记本黑屏了,排线出问题还是静电
  • jvm安全点(三)openjdk17 c++源码垃圾回收之安全点结束,唤醒线程
  • Mysql 8.0.32 union all 创建视图后中文模糊查询失效
  • 数字电子技术基础(五十九)——脉冲触发的触发器
  • (8)python开发经验
  • 开源安全大模型Foundation-Sec-8B实操
  • Vim编辑器命令模式操作指南
  • python打卡day28
  • Florence2代码实战
  • STM32IIC实战-OLED模板
  • 端口443在git bash向github推送时的步骤
  • 手机打电话时由对方DTMF响应切换多级IVR语音应答(二)
  • C++中析构函数不设为virtual导致内存泄漏示例
  • 使用glsl 来做视频矫正
  • 单细胞转录组(2)单细胞测序原理
  • 【Linux网络与网络编程】12.NAT技术内网穿透代理服务
  • 【前端基础】HTML元素隐藏的四个方法(display设置为none、visibikity设置为hidden、rgba设置颜色、opacity设置透明度)
  • DeepSeek 赋能社会科学:解锁研究新范式
  • 现在市面上三大常用的拓客软件好用吗?
  • 机器学习,深度学习,神经网络,深度神经网络之间有何区别?
  • PostgreSQL内幕剖析——结构与架构