volatile 关键字的功能

242 阅读1分钟

volatile 关键字的功能

volatile 是 java中的一个类型修饰符。那么它到底做了什么?

1 它禁止了指令重排

2 它保证了多线程操作的可见性

3 它不保证原子性(线程不安全)

然后开始介绍介绍 原子性、可见性和有序性的概念。

原子性: 一个操作的是不可分割、中断的,其中一个步骤执行失败就全部执行失败,所以只有全部执行成功或者全部执行失败。

可见性: 当多个线程访问同一个变量时,一个线程修改了一个变量的值,则其他线程立即就能看到这个值的改变。

有序性: 程序执行的顺序按照代码的先后顺序执行

1 float a = 5.0f; 2 double b = 6.0;

像这两句代码,是1先执行,再是2执行,但是JVM为了提高执行效率,在执行时不一定是按照代码顺序执行的,这就是指令重排。处理器为了提高效率,它会对执行代码进行优化,它不会保证程序中各个语句的执行顺序和代码中的顺序一致,但是会保证执行的结果和代码顺序执行的结果相一致。上述1、2行代码,谁先执行对执行的最终的结果并没有什么影响,那么就有可能2比1先执行。

当然在指令重排时,会考虑指令之间的依赖性,如果2依赖了1的值,那么处理器会保证1在2之前执行。