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不要修饰引用类型,因为引用里面的对象改变了,他察觉不到。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。