Java i++ 是原子性的吗?多线程i++的结果

文章探讨了编程语言中i++操作的非原子性,指出其在多线程环境下可能导致的问题。通过原子类AtomicInteger举例,解释如何使用线程安全的方法解决线程间i值累加问题。
摘要由CSDN通过智能技术生成

结论

i++ 不是原子性的!!!

理由

如果你学习过 C 或者Java 等基础语法,那么一定知道
i++ 和 ++i 都不是一步完成的,只不过写法简化了而已

i++ 操作在大多数编程语言中,包括 Java 和 C/C++ 等,并不是原子性的。这个操作实际上包含了三个不可分割的步骤:
读取当前值。
将该值加一
将新值赋值(也就是写回内存)

衍生问题

多线程操作i++ 的结果,结果最低 i 的值和单线程的结果一致(相当于假使了所有现场大家每次操作的时机和赋值都是一摸一样的),最大值相当于所有线程的执行结果总和,即 线程数 * 单线程的结果。

为了解决多线程的这种累加问题,可以使用原子类java.util.concurrent.atomic 包下的原子类,如 AtomicInteger 来实现线程安全的递增操作。
AtomicInteger 提供了诸如 getAndIncrement() 方法,该方法保证了递增操作的原子性。

  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值