1.volatile修饰的变量,能够保证“内存可见性”:
代码在写入volatile修饰的变量时:
①当一个被volatile关键字修饰的变量被一个线程修改的时候,其他线程可以立刻得到修改后的结果。
②当一个线程向被volatile修饰的变量写入数据的时候,虚拟机会强制他被刷新到主内存中,保证每次都是从主内存中读取变量的值。
代码在读取volatile修饰的变量时:
①从主内存中读取volatile变量的最新值到线程的工作内存(cpu寄存器或cpu缓存),缓存的读取速度介于寄存器和内存之间。
②当一个线程被volatile修饰时,修改后也可直接在主内存中读取。(cpu每次都需要从主内存中读取,性能会减弱)
2.volatile修饰的变量,不保证“原子性”:
volatile强制读写内存,适用于一个线程读,一个线程写~(速度是变慢了,但是数据变得更准确)
3.volatile修饰的变量,能够防止指令重排序:
指令重排序是编译器和处理器为了高校对程序优化的手段,只能保证程序的执行结果正确,但无法保证程序的操作执行顺序和代码顺序一致。指令重排序在单线程中不会出现问题,在多线程中会出现问题。