在网上搜索了一下volatile,文章一大堆,但是能真正理解volatile的含义的不多,更有甚者,仅仅是作者个人的理解,误导众网友。
volatile 有以下作用:1.保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的,2.禁止进行指令重排序
经常用在多线程方面,好多人会以为对于加上volatile修饰的变量,在并发访问时候可以做到数据的安全,其实是怎么样的呢?来看一下栗子吧
demo运行结果:988,982 ......不是我们期望的999,
原因是什么?在计算机运行过程,cpu 的执行速度远大于内存的读写速度,为了加快内存的读写,jvm采用高速缓存,即首先取高速缓存里的值,更新完之后再同步到内存中。比如:有两个线程1、2,线程1读取count的值,然后进去阻塞,线程2也读取count,由于1并未修改count,所以2的缓存行有效,2进行修改使得count变为1,1因为已经读取count,执行count+1=10。
其实,说白了,就是每个线程有一个独立的工作内存(共享变量副本)和线程共享的主内存,线程在各自内存操作数据,然后再同步到主内存,而用volatile修饰的变量,线程会直接操作主内存,即线程间可见。
要防止以上的情况,可以采用synchronized lock 等
此外,volatitle还有一个作用,禁止指令重排,在保证结果一致的情况下,jvm会对代码进行优化。
网友评论