Java深入理解volatile

public class VolatileTest {
    /**
     * volatile的实现原理
     * 在生成汇编代码时,对于被volatile修饰的变量,进行写操作时会多出lock前缀的指令。
     * 这个指令所带来的影响:
     *  1.将当前处理器缓存行的数据写回主内存。
     *  2.这个写回主内存的操作会是其他内存中改变量的内存地址失效。
     *
     *  如果对声明了volatile的变量进行写操作,jvm会向处理器发送一条lock前缀的指令,将这个变量
     *  所在缓存行中的数据写回到主内存中。同时时其他线程中改变量的内存地址失效。当其他线程对改变量进行
     *  写操作时,会发现其缓存中的变量的地址已失效,就回去主内存中重新读取改变量的值到处理器缓存中。
     */

    private static volatile boolean flag = false;

    public static void main(String[] args) {
        Thread aThread = new Thread(new Runnable() {
            public void run() {
                while(!flag){//线程读取flag=false
                    System.out.println(flag);
                }
            }
        });
        aThread.start();
        try {
            Thread.sleep(1000);//主线程睡1秒
            flag = true;//修改主线程flag 此时aThread的缓存中的flag失效,需要重新读取flag flag = true;循环结束。
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }
}

你可能感兴趣的:(Java深入理解volatile)