gpt4 book ai didi

java - 线程和 println() 语句之间的关系

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:43:09 24 4
gpt4 key购买 nike

我试图创建一些场景来演示跨线程共享变量时的可见性问题。我注意到,在我测试的几乎所有情况下,如果在 run() 中我在使用共享变量的同一代码块中添加了 System.out.println() 语句,则不会产生可见性问题。我举一个例子:

配置详细信息 - Oracle Java6 64 位、Eclipse Juno SR 2

  • 1) 存在可见性问题:

    public class NoVisibility_Demonstration extends Thread {
    boolean keepRunning = true;
    public static void main(String[] args) throws InterruptedException {
    NoVisibility_Demonstration t = new NoVisibility_Demonstration();
    t.start();
    Thread.sleep(1000);
    t.keepRunning = false;
    System.out.println("keepRunning is false");
    }
    public void run() {
    int x = 1;
    while (keepRunning)
    {
    //System.out.println("If you uncomment this line, the code will work without the visibility issue");
    x++;

    }
    System.out.println("x:"+x);
    }

输出:线程一直在无限运行

  • 2) 没有可见度问题:

与上面相同的代码,在 run() 中有未注释的 println() 语句

输出:

...

如果您取消注释这一行,代码将在没有可见性问题的情况下运行

如果您取消注释这一行,代码将在没有可见性问题的情况下运行

如果您取消注释这一行,代码将在没有可见性问题的情况下运行

x:19391

keepRunning 为假

因为我在我尝试的所有示例中都注意到了类似的行为,所以我想知道在任何 I/O 操作之前 JVM 是否进行了任何数据完整性检查。

最佳答案

PrintWriter 是同步的

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

System.out.println() 在主线程和第二线程中的两次顺序调用在两个线程之间创建了一个同步顺序。这意味着在释放监视器(退出同步方法)之前在主线程中发生的所有操作(在您的情况下是变量更新)将被代码看到,在获得监视器后在第二个线程中执行(进入同步方法) .

简单来说,是的,调用 System.out.println() 进行同步。

关于java - 线程和 println() 语句之间的关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34311600/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com