vilatile相当于轻量级的synchronized,它主要用于修饰共享变量,可以保证变量的可见性,有序性,但是不能保证原子性。
可见性:多线程环境下,某线程修改了共享变量,其他线程可以查觉到。原理是通过在内存模型中修改了某值,会将他同步到主存,在读取前从主存刷新该变量实现的。
有序性:在java中,由于寄存器和内存的处理速度存在明显差异,所有java为了提升运行速度,会将编译好的代码进行指令重排序,但在单线程下不影响运行结果;有序性既指在某个线程中,对该变量的操作顺序不发生改变;其底层时采用内存屏障所实现,在编译器生成字节码时候,会在指令序列中插入内存屏障来禁止特定类型的处理器进行指令重排序;内存屏障就是一段与平台相关的代码,在Unsafe类中定义,共包含三个方法:LoadFence(),storeFence(),fullFence();
原子性:一个操作不可中断,要么全部执行完成,要么都不执行;volatile对单个变量读写具有原子性,对复合操作不具有原子性;