Volatile 关键词

Nov 2, 2020 · 1 min read

volatile适合这种场景:一个变量被多个线程共享,线程直接给这个变量赋值。

正常情况下: 有一个内存区域是jvm虚拟机栈,每一个线程运行时都有一个线程栈。

  1. 当线程访问某一个对象时候值的时候,首先通过对象的引用找到对应在堆内存的变量的值,然后把堆内存变量的具体值load到线程私有内存中(线程栈),建立一个变量副本
  2. 之后线程就不再和对象在堆内存变量值有任何关系,而是直接修改副本变量的值。
  3. 在修改完之后的某一个时刻(线程退出之前),自动把线程变量副本的值回写到对象在堆中变量。

volatile变量改变后写回主内存时,会让所有线程的工程内存中该变量副本置为无效,那么其他线程再次读取变量副本时由于副本时无效的会从主内存中重新读取,从而达到读取到最新值的效果

volatile适合这种场景:一个变量被多个线程共享,线程直接给这个变量赋值。 值得说明的是对volatile变量的单次读/写操作可以保证原子性的,如long和double类型变量,但是并不能保证i++这种操作的原子性,因为本质上i++是读、写两次操作。

public class VolatileTest extends Thread {
     
     boolean flag = false;
     int i = 0;
     
     public void run() {
         while (!flag) {
             i++;
         }
     }
     
     public static void main(String[] args) throws Exception {
         VolatileTest vt = new VolatileTest();
         vt.start();
         Thread.sleep(2000);
         vt.flag = true;
         System.out.println("stope" + vt.i);
     }
 }
Bang
Authors
Professor of Artificial Intelligence
My research interests include distributed robotics, mobile computing and programmable matter.