Java IO的线程变量共享实现



我对这样的代码片段感到困惑:

public class LearnTest {
private static boolean tag = true;
private static int i = 0;
public static void main(String[] args) {
    new Thread(new Runnable() {
        @Override
        public void run() {
            while (tag) {
                //System.out.println("ok");
                i++;
            }
        }
    }).start();
    try {
        Thread.sleep(1000);
    }catch (Exception e) {
        e.printStackTrace();
    }
    tag = false;
    System.out.println(i);
  }
}

在代码中,我们有一个 new-threadmain-thread .有关此代码的结果将是随机值 i,并且new-thread不会退出。因为new-thread不会得到新的tag值。

如果我们更改将用volatile装饰的tag的定义,它将打印一些i值,new-thread将退出。因为volatile将保持所有线程的可见性。

但是当我不能为注释的代码行添加注释时,tag不会被装饰女巫volatile,它会打印一些"ok"并退出。

为什么?

我想Java的IO会做类似synchronized的事情,它会强制new-threadtag端值从主共享内存刷新。

这是科雷特?

如果没有volatile,线程不能保证看到值的更改。它可能会看到它们。

在这种情况下,添加System.out.println()(显然(会导致值从缓存中删除,因此它会在某个时候从主内存中获取。如果没有println()值将保留在缓存中,您将获得无限(或至少很长(循环。

这是并发编程的一个困难,有时代码可能看起来工作正常,但没有办法确定它总是正常工作。

最新更新