关于println和sleep 会在不适用volatile 关键字的情况下跳出循环?

 package com.test;

import java.util.concurrent.TimeUnit;

public class test1 {

    private static boolean is = true;
    public static void main(String[] args) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                int i = 0;
                while(test1.is){
                    i++;
                    //println 是synchronized 的,会强制刷新住内存的变量值到线程栈?
                    System.out.println("1");
                    /* 
                     * sleep 会使is的值 在线程栈中失效,从新load 住内存的值? 
                     try {
                        TimeUnit.MICROSECONDS.sleep(1);
                    } catch (InterruptedException e) {
                        e.printStackTrace();  
                    }*/
                } 
            }
        }).start();
         try {
            TimeUnit.MICROSECONDS.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();  
            }
        new Thread(new Runnable() {
            @Override
            public void run() {
                is = false;

            }
        }).start();

    }
}

上面这段代码,在循环中加入println 或者 sleep 都会使循环终止。为什么?

http://blog.csdn.net/feier7501/article/details/20001083

因为println和sleep的操作都有对外部volatile变量的访问,在访问volatile变量时,jdk高版本为把之前的cache刷新一次,所以is改变的值就变得可见了。

希望对你有帮助。