Volatile关键字对熟悉java多线程的朋友来说,应该很熟悉了。Volatile是JMM(Java Memory Model)的一个非常重要的关键词。通过是用Volatile可以实现禁止重排序和变量值线程之间可见两个主要特性。
今天我们从汇编的角度来分析一下Volatile关键字到底是怎么工作的。
[JetBrains IntelliJ IDEA 2020 for Mac(强大的 Java 集成开发工具)]( https://www.macz.com/mac/3642.html)重排序
这个世界上有两种重排序的方式。
第一种,是在编译器级别的,你写一个java源代码,经过javac编译之后,生成的字节码顺序可能跟源代码的顺序不一致。
第二种,是硬件或者CPU级别的重排序,为了充分利用多核CPU的性能,或者CPU自身的处理架构(比如cache line),可能会对代码进行重排序。比如同时加载两个非互相依赖的字段进行处理,从而提升处理速度。
我们举个例子:
public class TestVolatile { private static int int1; private static int int2; private static int int3; private static int int4; private static int int5; public static void main(String[] args) throws InterruptedException { for (int i = ; i < 10000; i++) { increase(i); } Thread.sleep(1000); } private static void increase(int i){ int1= i+1; int2= i+2; i