打印语句对变量的影响

来源:1-5 JAVA内存模型

ChlZhYa

2019-03-11

public class TestVolatile {
    public static void main(String[] args) {
        ThreadDemo td = new ThreadDemo();
        new Thread(td).start();
        while (true) {
	        //   System.out.println();
            if (td.isFlag()) {
                System.out.println("**********");
                break;
            }
        }}}
class ThreadDemo implements Runnable {
    private boolean flag = false;
    @Override
    public void run() {
        try {
            Thread.sleep(3);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        flag = true;
    }
    public boolean isFlag() {
        return flag;
    }
    public void setFlag(boolean flag) {
        this.flag = flag;
    }
}

老师,请问这个例子中,为什么循环中System.out.println();被注释之后,while循环就不会退出(即td.isFlag()的状态在主线程中没有被更新为true)。然而放开注释之后,while循环就能读取到flag = true

写回答

1回答

Jimin

2019-03-11

你好,system.out.print这个方法你可以点进去看一下实现,里面是有synchronized的,这会导致变量强制同步,对多线程运行有很大影响。因此线上环境通常都不使用这个方法打印日志。

0
1
ChlZhYa
非常感谢!
2019-03-11
共1条回复

Java高并发编程,构建并发知识体系,提升面试成功率

构建完整并发与高并发知识体系,倍增高薪面试成功率!

3923 学习 · 832 问题

查看课程