volatile关键字的理解

  首先volatile只能修饰实例变量或者类变量,不能修饰方法、局部变量、方法参数等。并发的三个至关重要的特性,原子性可见性、有序性,volatile只能保证前面的两个特性,所以使用volatile关键字要在合适的业务场景。

  一、volitile的可见性

  多线程的可见性,简单来说是指多个线程共享的变量修改以后,各个线程都能看到变量已经修改了,并且从主内存中拷贝变量改变后的值。

        

public class TestVisibility {
    private static boolean stopFlag;

    public static void main(String[] args)throws InterruptedException{

        Thread loop = new Thread(()->{
            int i=0;
            while(!stopFlag){
                i++;
            }
            System.out.println("Thread is stopped and evaluated result is:"+i);
        });
        loop.start();
        TimeUnit.SECONDS.sleep(1);
        stopFlag = true;
    }
}

  上面的TestVisibility的测试类,预计期望1秒后程序会停止并打印出计算结果,但运行结果是它会一直运行没有停止。

变量stopFlag是基本数据类型所以线程操作是原子的,单个原子操作是线程安全的,但是只能保证原子性,对其他线程是不可见的,在主线程sleep一段时间后 stopFlag 的修改子线程loop没有感知到,循环会一直继续下去。

要使loop线程在sleep后正常退出,可以stopFlag前加上volatile关键字就可以了,因为volatile是可以保证可见性的。

  二、有序性

  有序性:是指按照代码的先后的执行程序。但是由于Java编译器的优化,代码的执行顺序不一定是你编写后代码的顺序。

int x=0;
int y=0;
x++;
y=20

  上面的代码执行可能是按照从上至下编写的顺序执行的,但在jvm执行的时候不一定是这样的顺序,有可能 y=20 在x++的前面执行,这就是指令的重排序。

  volatile可以保证有序性。volatile对修饰的变量前后无依赖关系的指令可以随便怎么排序:

1 int x=0;
2 int y=0;
3 volatile z=20;
4 x++;
5 y=20

上面第3行的前后的逻辑不管怎么排列,只要到第3行执行的时候x=0 y=0就可以。对变量z多个线程进行操作,volatile的有序性强制限制修改变量的线程要在读的线程之前。

  

 

  

(0)

相关推荐

  • JAVA内存模型和Happens-Before规则

    前言 上一篇文章王子给大家介绍了并发编程中比较关心的三个核心问题,可见性.有序性和原子性. 今天我们继续来探索并发编程的内容,聊一聊JAVA的内存模型和Happens-Before规则. JAVA内存 ...

  • 7张图带你轻松理解Java 线程安全

    每日英文 Sometimes there is no next time, no second chance, no time out. Sometimes it is now or never. 有 ...

  • C语言丨深入理解volatile关键字

    本篇文章是对C语言中关键字volatile的含义进行了详细的分析介绍,希望能在学习上帮助大家.   volatile是一个类型修饰符(type specifier).它是被设计用来修饰被不同线程访问和 ...

  • C/C++ 中 volatile 关键字详解 | 菜鸟教程

    C/C++ 中 volatile 关键字详解 | 菜鸟教程

  • volatile关键字详解

    volatile的三个特点 保证线程之间的可见性 禁止指令重排 不保证原子性 可见性 概念 可见性是多线程场景中才讨论的,它表示多线程环境中,当一个线程修改了共享变量的值,其他线程能够知道这个修改. ...

  • volatile关键字的作用

    volatile关键字的作用 1.java内存模型. 如上图所示,所有线程的共享变量都存储在主内存中,每个线程都有一个独立的工作内存,每个线程不直接操作在主内存中的变量,而是将主内存上变量的副本放进自 ...

  • C语言中volatile关键字的作用

    一.前言 编译器优化介绍: 由于内存访问速度远不及CPU处理速度,为提高机器整体性能, 1)在硬件上:  引入硬件高速缓存Cache,加速对内存的访问.另外在现代CPU中指令的执行并不一定严格按照顺序 ...

  • 深入理解 Java 中的 final 关键字

    final 是Java 中重要关键字之一,可以应用于类.方法以及变量上.这篇文章中将讲解什么是 final 关键字?将变量.方法和类声明为 final 代表了什么?使用 final 的好处是什么? f ...

  • 全国人大常委会关于《中华人民共和国刑法》第九章渎职罪主体适用问题的解释(附:理解与适用)

    ☞[招募律师站长]☜ 全国人民代表大会常务委员会关于<中华人民共和国刑法>第九章渎职罪主体适用问题的解释 (2002年12月28日通过) 全国人大常委会根据司法实践中遇到的情况,讨论了刑法 ...

  • 体谅与理解

    人生的路上,如果懂得体谅,懂得理解,懂得宽容,日子就会很温馨,也会很安宁. 人生的路上,如果缺少体谅,不能理解,没有谦让,日子就会很糟糕,越过越烦恼. 生活中的很多烦恼,就是源于我们不能够体谅,过分在 ...

  • 色盲患者看到的世界永远黑白的,他们是无法理解世界的真实色彩的

    哲学那点事(五)--我能认知什么?色盲患者看到的世界永远黑白的,他们是无法理解世界的真实色彩的色盲是由于视网膜视锥细胞中的光敏色素异常或不全所导致的色觉紊乱,从而缺乏辨别一种或多种颜色的能力.色盲又分 ...