多线程“不可预测”的行为

时间:2016-05-09 11:25:47

标签: java multithreading

我正在浏览volatile的用例,我遇到了以下情况:

private static boolean stop = false;
public static void main(String[] args) throws InterruptedException {
    Thread runner = new Thread(new Runnable() {

        @Override
        public void run() {
            int i = 0;
            long start = System.currentTimeMillis();
            while(!stop){
                i++;
            }
            System.out.println("I m done after "+(System.currentTimeMillis() - start));
        }
    });

    runner.start();
    Thread.sleep(2000);
    stop = true;
}

以上代码无限期运行。由于编译器在尝试优化代码时完成提升,这很好。但是,如果我用其他声明替换 i ++ ,例如的的System.out.println( “你好”)即可。它会在2秒后停止。

为什么行为是这样的?我使用的是jdk1.7.0_51。

注意: 我知道我应该声明停止为volatile。但是,我想知道在上述情况下行为的原因。

1 个答案:

答案 0 :(得分:0)

标准输出是跨线程的共享资源。使用synchronized块使Java <p> <label for="hours">Learn JavaScript the Hardy Way’ - Complete e-book (Printed)</label> <input type="number" min="0" id="chap7" name="hours" value="0"> </p> <p class="post">Postage : <strong>£<output id="post">0</output></strong><p>类成为线程安全的,并且所有同步块都是java中的内存障碍,这就是为什么PrintStream字段上的更改在循环内变得可见的原因。但是,你不应该依赖它。

例如,看一下stop实现:

PrintStream.println