volatile为什么不能保证原子性?

本文探讨了Java中volatile关键字的可见性特性,它确保了多线程环境下的数据同步。然而,volatile无法保证操作的原子性,通过一个并发示例展示了当多个线程对共享变量执行++操作时,由于缺乏原子性,可能导致数据不一致的问题。这强调了在并发控制中正确使用锁或其他同步机制的重要性。
摘要由CSDN通过智能技术生成

volatile为什么不能保证原子性?

我们来看一下JMM是如何解释的
JMM规定了所有的变量都存储在主内存(Main Memory)中,多个线程共享主内存中
的数据。每个线程都有自己的工作内存(Working Memory),线程的工作内存中保
存了该线程使用到的变量在主内存的副本拷贝,线程对变量的所有操作(读取、赋
值等)都必须在工作内存中进行,而不能直接读写主内存中的变量。不同的线程之
间也无法直接访问对方工作内存中的变量,线程之间值的传递都需要通过主内存来
完成。
我们先来看一下volatile的可见性
可见性:在多线程情况下,当一个线程将主内存中的数据拷贝到工作内存中,在自
己的工作内存中对数据进行修改,修改之后将工作内存中的数据刷新到主内存中,
因为主内存中的数据发生的变化,这时会通知其他的线程来重新获取当前共享数据
。
通俗来讲:一个线程对数据进行修改,其他的线程可见。
我们再来谈一谈volatile为什么不能保证原子性?
我们构造出一个例子:
	工作内存中有一个共享的变量 int number = 0
	我们有四个线程:线程1、线程2、线程3、线程4
	假设线程中的操作都是对 number++
我们做出假设:
	开始四个线程都将共享变量读入到自己的工作内存中,同时执行++操作,然后
线程1将自己的变量刷新到主内存中,此时值为 number = 1,因为变量发生的变化
,线程2、线程3都开始重新读取数据进行操作,线程4在没有收到变量发生改变的
通知之前,已经将自己的变量刷新到主内存,此时主内存中的变量 number 还是等
于1,但此时线程1、线程4都已经执行完,所以最后的结果时2或者3.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值