JAVA之锁-volatile

锁是JAVA多线程关键,也是面试中必问的, 在此好好总结一下。面试

(先要从进程和线程提及,此处先欠下,回头专门说一下操做系统是怎么管理进程和线程的)编程

说到多线程就要说说JAVA的内存模型:图片来自于网络。数组

  Java内存模型的主要目标是定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中取出变量这样底层细节。此处的变量与Java编程时所说的变量不同,指包括了实例字段、静态字段和构成数组对象的元素,可是不包括局部变量与方法参数,后者是线程私有的,不会被共享。网络

  Java内存模型中规定了全部的变量都存储在主内存中,每条线程还有本身的工做内存,线程的工做内存中保存了该线程使用到的变量到主内存副本拷贝,线程对变量的全部操做(读取、赋值)都必须在工做内存中进行,而不能直接读写主内存中的变量。不一样线程之间没法直接访问对方工做内存中的变量,线程间变量值的传递均须要在主内存来完成,线程、主内存和工做内存的交互关系如上图所示。多线程

这就有一个内存可见性的概念了。 spa

   若是变量在a线程中改变了,b线程要立马感知到,就要经过volatile关键字了。 其做用就是 b线程要用到此变量的时候,将本地副本抛弃掉,而后从新从主存去读取。操作系统

  volatile 解决了线程共享变量的可见性,synchronized 也能够作到。线程

 volatile 修饰变量 可是他解决不了原子性, 好比,volatile  int  count  ;     方法中对其   count++  , 在多个线程对其操做,最终预期值会是错误的。解决方法能够加synchronized ,CAS。对象

相关文章
相关标签/搜索