美文网首页
java volatile解读

java volatile解读

作者: sunshaohua520 | 来源:发表于2017-07-21 15:29 被阅读0次

    在网上搜索了一下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会对代码进行优化。

    相关文章

      网友评论

          本文标题:java volatile解读

          本文链接:https://www.haomeiwen.com/subject/ooqekxtx.html