2 xiaoyagouwei xiaoyagouwei 于 2016.04.17 02:34 提问

关于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 都会使循环终止。为什么?

2个回答

devmiao
devmiao   Ds   Rxr 2016.04.17 03:54
w172087242
w172087242   Ds   Rxr 2016.04.19 16:10

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

希望对你有帮助。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!