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

posted @ 2019-03-22 09:30  从让帝到the_rang  阅读(199)  评论(0编辑  收藏  举报