美文网首页
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解读

    在网上搜索了一下volatile,文章一大堆,但是能真正理解volatile的含义的不多,更有甚者,仅仅是作者个人...

  • Java volatile解读

    一、开篇 在上一篇文章《Java 锁》里,我们着重介绍了解决多线程在访问同一共享资源时,并发操作产生的数据不安全的...

  • Java Volatile transient 关键字

    Java Volatile transient 关键字 java关键字volatile Volatile修饰的成员...

  • Volatile理解

    Java Volatile1. volatile 理解2. volatile 不保证原子性3. Volatile ...

  • volatile关键字

    volatile keyword example How to use volatile keyword in java

  • volatile关键字

    java中关键字volatile的作用; volatile vs synchronized的区别 Java并发编...

  • 多线程、并发及线程的基础问题

    一、Java 中能创建 volatile 数组吗? 能,Java 中可以创建 volatile 类型数组,不过只是...

  • Java并发编程系列-volatile

    原创文章,转载请标注出处:《Java并发编程系列-volatile》 一、概述 据说,volatile是java语...

  • volatile关键字小总结

    本文内容:1.volatile语义2.由volatile语义引出JMM3.volatile不能保证原子性的解读4....

  • java关键字-volatile

    前言 java 5之前这个关键字备受争议,java5只有volatile才得以重生 因为volatile和java...

网友评论

      本文标题:java volatile解读

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