栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

为什么即使修改了锁变量,我也会得到一个无限的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;    }}

注意同步。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/438643.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号