在java中,并发考虑的是三个方面,原子性,可见性,有序性.
使用volatile可以保证可见性和有序性.
其中说到可见性时,提示说volatile修饰的变量在更改值的情况下,会将变量值直接同步到主内存中,并通知其他线程中该变量值失效,这一"直接同步到主内存"是如何实现的,是同时执行了assign -> store -> write三个操作才保证更改同步到主内存的么?可是虚拟机规范中规定的assign,store,write才是原子性操作,万一这三步执行中间时刻,有其他线程读取了数据,那怎么办?
还有一点,对于多线程来说:比如线程A和B,同时执行了对全局变量c的write原子操作,那怎么处理?谁会先执行?还是说在A线程对c变量执行store或者write操作时,其他线程无法对变量c进行任意的原子性操作?
java原子性操作,volatile
- 写回答
- 好问题 提建议
- 追加酬金
- 关注问题
微信扫一扫
分享- 邀请回答
3条回答 默认 最新
- 关注
码龄 粉丝数 原力等级 --
- 被采纳
- 被点赞
- 采纳率
oyljerry 2018-03-02 03:07最佳回答 专家已采纳所以说volatile没有原子性保证,如果有同时操作,就可能还是会读取到旧值,所以还是要靠synchronized来保证原子同步。
但是如果是一个线程同步处理完了以后,另一个线程就会去读主内存,这样就能读取到新的值采纳该答案 已采纳该答案 专家已采纳评论解决 无用打赏举报微信扫一扫
分享评论登录 后可回复...
查看更多回答(2条)
报告相同问题?
提交
相关推荐 更多相似问题
- 2018-03-02 02:42回答 3 已采纳 所以说volatile没有原子性保证,如果有同时操作,就可能还是会读取到旧值,所以还是要靠synchronized来保证原子同步。 但是如果是一个线程同步处理完了以后,另一个线程就会去读主内存,这样
- 2015-06-03 16:11回答 5 已采纳 volatile只是保证从主内存加载到线程工作内存的值是最新的. 你也说了“线程A从主存中拿到i为1,线程A没有进行加法运算,被阻塞了”,相当于线程A已经从主存取完值了,这时候主存中数值的更新和线程
- 2016-01-01 05:51回答 6 已采纳 简单来说,volatile在多cpu环境下不能保证其它cpu的缓存同步刷新,因此无法保证原子性。
- 2021-08-31 15:59专注写bug的博客 在 java——volatile关键字 博客中,之前提到了volatile 保证数据及时可见性,但不保证原子性的问题。 在 volatile保证及时可见性 博客中,也重点举例说明了为什么volatile能够保证及时的可见性问题。 本篇博客重点...
- 2021-02-26 14:12蔡澜的博客 17.7.Non-Atomic Treatment of double and longFor the purposes of the Java programming language memory model, a single write to a non-volatile long or double value is treated as two separate writes: on....
- 2020-09-01 12:50volatile关键字虽然从字面上理解起来比较简单,但是要用好不是一件容易的事情。这篇文章主要介绍了Java中volatile关键字的作用与用法详解的相关资料,需要的朋友可以参考下
- 2012-03-15 17:48回答 5 已采纳 你自己回答到了 x=x+1确实不是原子操作所以可能出现两个1 x++,++x等都不是原子操作
- 2012-03-28 23:36回答 1 已采纳 因为set int的时候只需要一步操作,而set long的时候需要两步。 如果是int i; i++的话 这时候i++也是不保证原子性的,不管是不是volatile,因为有两步操作。 所以vol
- 2021-11-08 11:05回答 1 已采纳 原子操作就是,A线程操作了变量,其余所有变量也跟着变化了。请参考我的文章 java关于多线程并发和异步操作由浅入深_西凉的悲伤博客-CSDN博客
- 2021-07-16 16:53java代码-volatile原子性
- 2021-01-21 17:08此外需注意volatile并不保证操作的原子性。 (一)内存可见性 1 概念 JVM内存模型:主内存和线程独立的工作内存 Java内存模型规定,对于多个线程共享的变量,存储在主内存当中,每个线程都有自己独立...
- 2016-01-02 15:10回答 4 已采纳 正确结果应该是501,尝试不用yield方法,而是用循环判断,当活跃线程数大于1,就等待1秒,直到所有线程都运行完毕
- 2021-10-09 17:08回答 3 已采纳 java.util.HashMap在多线程环境中可能出现的问题_oLeiChang的博客-CSDN博客 众所周知,HashMap不是线程安
- 2016-11-23 09:29回答 1 已采纳 http://huangyunbin.iteye.com/blog/1944153
- 2020-08-10 15:11派大星是个小码农的博客 JMM(Java Memory Model) 概述:JMM(Java Memory Model)Java内存模型,是java虚拟机规范中所定义的一种内存模型。 Java内存模型(Java Memory Model)描述了Java程序中各种变量(线程共享变量)的访问规则,以及在JVM中将...
- 2020-12-30 02:19十一月上的博客 首先要了解的是,volatile可以保证可见性和顺序性,这些都很好理解,那么它为什么不能保证原子性呢? 可见性 可见性与Java的内存模型有关,模型采用缓存与主存的方式对变量进行操作,也就是说,每个线程都有自己...
- 2020-06-17 21:00ZHurric的博客 volatile在多线程编程中是一个十分重要的关键字,volatile被称为轻量级的synchronized,它保证了数据的可见性,同时其执行成本较synchronized更低。 2.保证可见性 多线程环境中,每个线程都有自己的工作空间,某个...
- 2011-05-24 22:01回答 1 已采纳 synchronized的increment方法保证了对count的修改是同步的,而get方法无需同步,因为读取不涉及到修改数据;lz只看到了volatile而忽视了synchronized的存在,可
- 2019-05-11 10:42胡小禾的博客 文章目录1、什么是原子操作2、Java中原子操作的实现方式2.1 用CAS实现原子操作2.1.2 使用CAS实现原子操作2.1.3 CAS实现原子操作的问题3、Java中使用锁实现原子操作4、CPU如何实现原子操作 1、什么是原子操作 原子...
- 没有解决我的问题, 去提问