1.定义:用volatile修饰的变量,线程在每次使用变量的时候,都会读取变量修改后的最的值。 2.语义: 第一:保证线程之间变量的可见性。简单地说就是当线程A对变量X进行修改后,在线程A后执行的其余线程能看到变量X的变化。更纤细的说是符合两个规则: *线程对变量进行修改以后,要马上写到主内存。 *线程对变量读取的时候,要从主内存中读,而不是缓存。java
有关线程执行过程当中住内存和缓存,能够进行以下解释。
JAVA 为了保证其平台型,使JAVA应用程序和操做系统内存模型隔离开,须要定义本身的内存模型。在java内存模型中,内存分为主内存和工做内存两个部分,其中主内存是全部线程所共享的,而工做内存则是每一个线程分配一份,各线程的工做内存彼此独立,互补课件,在线程启动的时候,虚拟机为每一个内存分配一块工做内存,不只包含了线程内部定义的局部变量,也包含了线程所须要使用的共享变量(非线程内构造对象)的副本,即为了提升执行效率,读取副本比直接读取主内存更快(这里能够简单地将主内存理解为虚拟机中的堆,而工做内存理解为栈) 对于共享普通变量来讲,约定了变量在工做内存中发生变化以后,必需要回写到工做内存(早晚要回写,并非立刻回写),但对于volatile修饰的变量,则要求在工做内存中发生变化以后,必须立刻回写到工做内存(之因此是工做内存是由于,原来的变化是在工做内存的副本中进行),而线程读取volatile变量的时候,必须立刻到工做内存中去取最新值,而不是读取本地工做内存的副本,此规则保证了前面所说的“当线程A对变量X进行修改后,在线程A后面执行的其余线程能看到变量X的变更。” 工做内存副本变更-工做内存变更-新的线程读取主内存的时候共有变量的值已经变化为最新值。缓存
重点详解:工做内存能够说是内存的一份缓存,为了不缓存的不一致性,因此volatile须要废弃此缓存,但除了内存缓存以外,在CPU硬件级别也是有缓存的,即寄存器。加入线程A将变量X由0修改成1的时候,CPU是在其缓存内操做,没有及时回写到内存,那么JVM是没法X=1是能及时被以后执行的线程B看到的。而JVM在处理volatile变量的时候,也一样用了硬件级别的缓存一致性原则。 第二:禁止指令重排序。如同咱们在另外一片博客《懒汉式和饿汉式》中所用到的一致。操作系统