volatile

Posted xm970829

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了volatile相关的知识,希望对你有一定的参考价值。

这里讲的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的主要内容,如果未能解决你的问题,请参考以下文章

Java 锁

Java 锁

synchronized和volatile使用

6.并发编程--volatile

C# 特性之volatile

关键字: volatile详解