volatile

作者: 尉昌达 | 来源:发表于2020-07-05 13:00 被阅读0次
    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

        本文链接:https://www.haomeiwen.com/subject/mfxvqktx.html