volatile

  1. 保证线程可见性

    • 缓存一致性协议
  2. 禁止指令重排序

    • JMM ,内存屏障

这个可以看单例模式的双重检查

线程可见性含义:

每个线程运行的时候,会先去主内存拷贝一份数据到自己的工作内存当中。
如果没有valatile,一个线程对某共享变量的值改变,可能不会马上通知到其他的线程。
而有了volatile,会把改变的值刷新到主内存,使其他线程可见。

public class T01_HelloVolatile {
    /*volatile*/ boolean running = true; //对比一下有无volatile的情况下,整个程序运行结果的区别
    void m() {
        System.out.println("m start");
        while(running) {
        }
        System.out.println("m end!");
    }
    
    public static void main(String[] args) {
        T01_HelloVolatile t = new T01_HelloVolatile();
        
        new Thread(t::m, "t1").start();

        try {
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        
        t.running = false;
    }
    
}

volatile不要修饰引用类型,因为引用里面的对象改变了,他察觉不到。

你可能感兴趣的:(volatile)