社区
周阳的课程社区_NO_1
互联网大厂高频重点面试题(上)
帖子详情
volatile不保证原子性
qq_35427282
2023-01-12 21:52:06
课时名称
课时知识点
volatile不保证原子性
volatile不保证原子性
...全文
116
回复
打赏
收藏
volatile不保证原子性
课时名称课时知识点volatile不保证原子性volatile不保证原子性
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
volatile
不
保证
原子性
及其解决办法
1.
volatile
不
保证
原子性
既然它可以
保证
修改的值立即能更新到主存,其他线程也会捕捉到被修改后的值,那么为什么不能
保证
原子性
呢? 首先需要了解的是,Java中只有对基本类型变量的赋值和读取是原子操作,如i = 1的赋值操作,但是像j = i或者i++这样的操作都不是原子操作,因为他们都进行了多次原子操作,比如先读取i的值,再将i的值赋值给j,两个原子操作加起来就不是原子操作了。 所以,如果一个变量被
volatile
修饰了,那么肯定可以
保证
每次读取这个变量值的时候得到的值是最新的,但是一旦需要对变量
Volatile
为什么不
保证
原子性
Volatile
不
保证
原子性
原子性
的相关概念 我们经常提到的就是事务具备
原子性
,其实
原子性
简单理解就是某一个线程在进行具体业务的时候,中间不能被分割,要不同时成功,要么同时失败 代码验证 MyData myData = new MyData(); //创建20个线程,线程里面进行1000次循环 for (int i = 1; i <= 20 ; i++) { new Thread(()->{
volatile
无法
保证
原子性
操作并不具备
原子性
,该操作是先读取值,然后写回一个新值,相当于原来的值加上1,分两步完成。对任意单个
volatile
变量的读/写具有
原子性
,但类似于
volatile
++这种复合操作不具有
原子性
(基于这点,我们通常会认为
volatile
不具备
原子性
)。
volatile
仅仅
保证
对单个
volatile
变量的读/写具有
原子性
,而锁的互斥执行的特性可以确保对整个临界区代码的执行具有
原子性
。
Volatile
不能
保证
原子性
虽然i被声明为
volatile
,但是i++操作并不是原子的。如果多个线程同时执行这段代码,可能会发生竞态条件,导致最终结果不是期望的。如果需要
保证
原子性
,可以使用synchronized关键字或java.util.concurrent.atomic包中提供的原子类(如AtomicInteger)来进行操作。这些机制可以确保多线程环境下的原子操作。,而不是线程的工作内存(缓存),从而确保对该变量的修改对其他线程可见。
volatile
关键字无法
保证
复合操作的
原子性
,例如递增操作i++。
周阳的课程社区_NO_1
1
社区成员
82
社区内容
发帖
与我相关
我的任务
周阳的课程社区_NO_1
复制链接
扫一扫
分享
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章