码迷,mamicode.com
首页 > 其他好文 > 详细

volatile

时间:2020-05-14 15:45:18      阅读:45      评论:0      收藏:0      [点我收藏+]

标签:data   应该   sof   play   font   多少   text   margin   为什么   

这里讲的volatile只是入门级别的,我先记录下,后续更新。
volatile的译文是不稳定的。
这里我要说的是volatile是个不保证原子性操作的,它只能保证单次读写的原子性。而i这种操作不能保证原子性。
先贴代码:
技术图片
代码很简单,首先定义一个静态的volatile变量,为什么需要的是静态的,静态依赖于类,只有一份,后面由两个线程对该volatile变量进行
操作。
run()方法是线程执行任务方法。在这里面一个线程给volatile变量执行++操作4000次。
执行结果截图(注意!!!结果不唯一):
技术图片

技术图片
pic-1589437924262.png

技术图片
pic-1589437924262.png

如上,三张图,三个不同的执行结果。
想要知道为什么会导致这样,首先得分析i操作到底干了些什么事,如下:
1:将变量i的值保存到临时变量中。2:对该临时变量的值+1操作。3:再将临时变量的值赋给i,让其它线程可见。
解释:
如上代码value值首先是为0的,当value第一次
,那么应该得到一,可是这个操作有三个步骤,当没有执行第三个步骤,那么value始终是0,值被+1的是临时变量。
而当value第一次
操作还没执行完的话,value第二次操作又来了,那么第二次进来的value值是多少呢?很显然还是0,因为第一个并没有执行完。
到这里就已经算是解释清楚了,个人觉得这个和线程很像。
一句话解释就是:第一个没执行完,第二个携带最初的值又来了。
但是记住哦,volatile并不是100%不保证原子性的哦,看上面代码执行的第二张截图,返回结果就是8000。
这里就像线程如果不加锁,可能会造成读写异常(与期望结果不一致),但是这并不是绝对的。

volatile

标签:data   应该   sof   play   font   多少   text   margin   为什么   

原文地址:https://www.cnblogs.com/xm970829/p/12888468.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!