volatile关键字浅析
1.volatile关键字的两层含义
一旦一个变量(类成员变量、类的静态成员变量)被volatile修饰之后,就具备了两层含义:
①保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其它线程来说是立即可见的。
②禁止进行指令重排序
2.volatile保证原子性吗?
volatile关键字保证了操作的可见性,不能保证对变量的任何操作都是原子性的。
3.volatile保证有序性吗?
volatile在一定程度上保证有序性。
volatile关键字禁止指令重排序有两层意思:
①当程序执行到volatile变量的读操作或者写操作时,在其前面的操作的更改肯定全部已经进行,且结果已经对后面的操作可见;在其后面的操作肯定还没有进行
②在进行指令优化时,不能将在对volatile变量访问的语句放在其后面进行,也不能把volatile变量后面的语句放到其前面执行。
4.volatile原理和实现机制
观察加入volatile关键字和没有加入volatile关键字时所生成的汇编代码实现,加入volatile关键字时,会多出一个lock前缀指令:
lock前缀指令实际上相当于一个内存屏障(也称内存栅栏),内存屏障提供3个功能:
①它确保指令重排序时不会把其后面的指令排到内存屏障之前的位置,也不会把前面的指令排到内存屏障的后面;即在执行到内存屏障这句指令时,在它前面的操作已经全部完成;
②它会强制将对缓存的修改操作立即写入主存;
③如果是·写操作,它会导致其它CPU中对应的缓存行失效
5.使用volatile关键字场景
synchronized关键字是防止多个线程同时执行一段代码,那么就会很影响程序执行效率,而volatile关键字在某些情况下性能要优于synchronized,但要注意volatile关键字是无法替代synchronized关键字的,因为volatile关键字无法保证操作的原子性。通常来说,使用volatile必须具备以下2个条件:
①对变量的写操作不依赖于当前值;
②该变量没有包含在具有其他变量的不变式中。