我正在浏览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。但是,我想知道在上述情况下行为的原因。
答案 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