为什么即使修改了锁变量,我也会得到一个无限的while循环?

为什么即使修改了锁变量,我也会得到一个无限的while循环?,第1张

为什么即使修改了锁变量,我也会得到一个无限的while循环?

简短答案

您忘了声明

guard
为易失性布尔值。


如果您将字段声明省略为

volatile
,则不会告诉JVM该字段可以被多线程看到,例如您的示例。

在这种情况下,的值

guard
将被读取一次,并且将导致无限循环。它将针对以下内容进行优化(无打印):

if(!guard){    while(true)    {    }}

现在为什么要

System.out.println
改变这种行为?因为
writes
同步的,这迫使线程不缓存读取。

这里粘贴了

println
一种
PrintStream
使用的方法的代码
System.out.println

public void println(String x) {    synchronized (this) {        print(x);        newline();    }}

write
方法:

private void write(String s) {    try {        synchronized (this) { ensureOpen(); textOut.write(s); textOut.flushBuffer(); charOut.flushBuffer(); if (autoFlush && (s.indexOf('n') >= 0))     out.flush();        }    }    catch (InterruptedIOException x) {        Thread.currentThread().interrupt();    }    catch (IOException x) {        trouble = true;    }}

注意同步。



欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/5134097.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-11-17
下一篇2022-11-17

发表评论

登录后才能评论

评论列表(0条)

    保存