volatile关键字
1. 计算机在执行程序时,每条指令都是在CPU中执行的,而执行指令过程中,会涉及到数据的读取和写入,但由于CPU执行速度很快,而从内存读取数据和向内存写入数据的过程跟CPU执行指令的速度比起来要慢的多,因此如果任何时候对数据的操作都要通过和内存的交互来进行,会大大降低指令执行的速度。因此在CPU里面就有了高速缓存。
也就是,当程序在运行过程中,会将运算需要的数据从主存复制一份到CPU的高速缓存当中,那么CPU进行计算时就可以直接从它的高速缓存读取数据和向其中写入数据,当运算结束之后,再将高速缓存中的数据刷新到主存当中。这样的操作在单线程中不会出现什么问题,但是在多线程中运行就可能会出现问题,会出现缓存不一致问题。
2. 解决缓存不一致的问题有:通过在总线加LOCK#锁的方式或者通过缓存一致性协议(硬件层次上的方法)。
3. volatile关键字的两层语义
一旦一个共享变量(类的成员变量、类的静态成员变量)被volatile修饰之后,那么就具备了两层语义:
1)保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的。
2)禁止进行指令重排序。
它能保证程序的可见性,一定程度的有序性,但是不能保证原子性(可以采用synchronized)。
4. 使用volatile必须具备以下2个条件:
1)对变量的写操作不依赖于当前值
2)该变量没有包含在具有其他变量的不变式中
具体更细致的可以看链接:https://www.cnblogs.com/dolphin0520/p/3920373.html