社区
高性能WEB开发
帖子详情
volatile变量在什么时候适用,可以保证原子性???
brave_panda
2014-07-16 04:33:13
最近在看《深入理解java虚拟机》,volatile变量的适用场景:
1、运算结果并不依赖变量的当前值,
2、变量不需要与其他的状态变量共同参与不变约束
怎么理解??
有没有比较个人的体会??
...全文
190
2
打赏
收藏
volatile变量在什么时候适用,可以保证原子性???
最近在看《深入理解java虚拟机》,volatile变量的适用场景: 1、运算结果并不依赖变量的当前值, 2、变量不需要与其他的状态变量共同参与不变约束 怎么理解?? 有没有比较个人的体会??
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
2 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
pricks
2014-07-17
打赏
举报
回复
volatile我以前也研究过 不过后来看很多并发的项目或框架,很少用到的 基本是通过同步锁来保证变量的线程安全性
MiceRice
2014-07-16
打赏
举报
回复
仅volatile不能保证原子性。 运算结果并不依赖变量的当前值 —— 举例,连并发的 i++ 都无法保证最终结果正确性。 有大量大牛写了关于 volatile 的案例啥的,你Google下就应该大把。
volatile
为什么不能
保证
原子性
?
volatile
只有写操作是
原子性
的,也就是数据操作完成后会立刻刷新到主内存中。但是被
volatile
修饰的
变量
在读的时候可能会被多个线程读。也就是说int i = 1;i++; A线程读 i = 1同时B线程也读了i = 1,然后自增完成刷新入主内存。i的值是2。 所以如果该
变量
是
volatile
修饰的,那可以完全
保证
此时取到的是最新信息。但在入栈和自增计算执行过程中,该
变量
有可能正在被其他线程修改,最后计算出来的结果照样存在问题,因此
volatile
并不能
保证
非原子操作的
原子性
,仅在单次读或者单次写这样
为什么
volatile
不能
保证
原子性
volatile
关键字本质上是一种内存屏障,它可以确保在
volatile
变量
写操作和读操作之间不会发生重排序,这样就可以
保证
对
volatile
变量
的修改能够立即对其他线程可见。但是,
volatile
只能
保证
可见性,并不能
保证
原子性
。 在 Java 中,
原子性
是指一个操作是不可中断的,即使在多线程环境下也是如此。但是,
volatile
变量
的写操作和读操作之间是可以被中断的,这意味着在读...
volatile
为什么不能
保证
原子性
首先要了解的是,
volatile
可以
保证
可见性和顺序性,这些都很好理解,那么它为什么不能
保证
原子性
呢? 可见性 可见性与Java的内存模型有关,模型采用缓存与主存的方式对
变量
进行操作,也就是说,每个线程都有自己的缓存空间,对
变量
的操作都是在缓存中进行的,之后再将修改后的值返回到主存中,这就带来了问题,有可能一个线程在将共享
变量
修改后,还没有来的及将缓存中的
变量
返回给主存中,另外一个线程就对...
volatile
变量
和 atomic
变量
有什么不同?
volatile
变量
:使用
volatile
关键字修饰的
变量
可以确保对该
变量
的读取和写入操作对其他线程是可见的。
volatile
变量
:
适用
于对
变量
的读取和写入操作都是简单的赋值操作,并且需要
保证
对其他线程的可见性。
volatile
变量
:
volatile
关键字只能
保证
对单个
变量
的读取和写入操作的可见性,不能
保证
复合操作的
原子性
。Atomic
变量
提供了一组原子操作方法,可以
保证
对
变量
的操作是原子的,同时也具有可见性。
volatile
变量
保证
了对
变量
的读取和写入操作的可见性,但不能
保证
复合操作的
原子性
。
8.
volatile
为啥不能
保证
原子性
?
volatile
为啥不能
保证
原子性
?如果要
原子性
需要怎么做?
保证
原子性
必然在底层硬件层次需要进行加锁
高性能WEB开发
25,985
社区成员
4,366
社区内容
发帖
与我相关
我的任务
高性能WEB开发
高性能WEB开发
复制链接
扫一扫
分享
社区描述
高性能WEB开发
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章