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

Java什么是原子性

原子性(Atomicity)就是指一个操作要么一次性做完,要么什么都不做,中间不允许被打断、分割,像“原子”一样嘛!一句话来说不可分割,不可终中断

 比如你去银行取钱,银行从卡里扣100块钱,同时把这100块交给你,这两个步骤必须是“原子的”,要么一起成功要么什么都不发生,如果中间突然被打断(只扣钱没给你现金),那指定不行呀。

在Java并发里,原子性指什么?

在多线程里,原子性意味着这个操作在CPU或JVM看来是“一条指令”,不会被别的线程打断、插入、看到一半的中间状态。

场景:多线程并发

在 Java 多线程里,多个线程可能同时对同一个变量/内存地址做读写操作。
如果这个操作不是原子的,就可能出现:线程 A 做到一半被挂起--》线程 B 进来改了值--》线程 A 恢复继续执行。这样就会有“线程安全”问题,比如经典的 ++ 操作

什么是“对 CPU/JVM 来说是一条指令”? i++ 操作在 JVM 或 CPU 里其实不是“一步”,底层包含3步

1. 读取 i 的值
2. i + 1
3. 把新值写回去

如果两个线程同时对 i++,有可能:

  • 线程 A 读到 i=5

  • 线程 B 也读到 i=5

  • A +1 后写回去,i = 6

  • B +1 后也写回去,i 还是 6(丢了一次加 1)

结果少加了!这就是非原子操作的典型并发 BUG。

怎么保证原子性?

Java的第一招:synchronized;用锁把一段代码包起来,同一时间只能一个线程执行,原子性 + 可见性都保证了。

第二招volatile:注意!volatile 只能保证可见性 & 禁止重排序,但不保证原子性。所以 volatilecount++ 还是不安全。

第三招原子类(AtomicIntegerAtomicBoolean):Java 提供了 java.util.concurrent.atomic 包,比如 AtomicInteger。它底层用了 CAS(Compare And Swap)原语,保证对某个变量的读改写是原子的

http://www.lryc.cn/news/593960.html

相关文章:

  • Java SpringBoot 对接FreeSwitch
  • AtCoder Beginner Contest 415
  • Web-SQL注入数据库类型用户权限架构分层符号干扰利用过程发现思路
  • 向日葵远程命令执行漏洞
  • 《深入C++多态机制:从虚函数表到运行时类型识别》​
  • IDEA中使用Tomcat两种方式
  • C51单片机学习笔记——定时器与中断
  • API接口签名和敏感信息加密使用国密SM方案
  • 上电复位断言的自动化
  • go-redis Pipeline 与事务
  • 《计算机网络》实验报告五 DNS协议分析与测量
  • Dockerfile配置基于 Python 的 Web 应用镜像
  • 随着GPT-5测试中泄露OpenAI 预计将很快发布 揭秘GPT-5冲击波:OpenAI如何颠覆AI战场,碾压谷歌和Claude?
  • 单片机启动流程和启动文件详解
  • 数组算法之【合并两个有序数组】
  • 嵌入式硬件篇---舵机(示波器)
  • 设备健康管理实施案例:从技术架构到落地效果的全栈解析
  • 嵌入式硬件篇---机械臂运动学解算(3自由度)
  • 【MySQL】索引中的页以及索引的分类
  • 全面解析MySQL(2)——CRUD基础
  • RabbitMQ面试精讲 Day 4:Queue属性与消息特性
  • UDP中的单播,多播,广播
  • RabbitMQ核心组件浅析:从Producer到Consumer
  • 30个常用的Linux命令汇总和实战场景示例
  • 使用 Pyecharts 绘制精美饼状图:从基础到高级技巧
  • nginx定期清理日志
  • Node.js:函数、路由、全局对象
  • 数据并表技术全面指南:从基础JOIN到分布式数据融合
  • 分布式文件系统04-DataNode海量数据分布式高可靠存储
  • ZooKeeper学习专栏(一):分布式协调的核心基石