首页 > 解决方案 > System.out.println 与 java volatile

问题描述

我有一个这样的例子:

public class MainApp {

    private volatile static int MY_INT = 0;

    public static void main(String[] args) {
        new Thread1().start();
        new Thread2().start();
    }

    static class Thread1 extends Thread {
        @Override
        public void run() {
            while(true) {
                MY_INT++;
                System.out.println("1 : " + MY_INT);
            }
        }
    }

    static class Thread2 extends Thread{
        @Override
        public void run() {
            while(true) {
                MY_INT++;
                System.out.println("2 : " + MY_INT);
            }
        }
    }
}

输出是:

1 : 1
2 : 2
1 : 3
2 : 4
1 : 5
1 : 7
1 : 8
1 : 9
1 : 10
2 : 6
1 : 11
1 : 13

我不明白为什么在打印 1:10 之后下一行是 2:6。谁能解释一下结果?提前致谢

标签: javamultithreadingvolatile

解决方案


这里有几个问题:

  • 线程可能不会并行运行。它们以时间片运行(默认值:PC 上的 15.6 毫秒;每秒 64 个滴答声,请参阅计时器分辨率(Microsoft))。这就是为什么你看不到一个接一个1:x2:x而是一个接一个1:x
  • usingvolatile对同步没有帮助。您需要真正的同步对象,例如AtomicIntegersynchronized关键字。因此,您可能会看到跳过的数字(输出中不是这种情况,但它可能会发生)。如果您想看到唯一的数字++,您需要围绕两者进行同步println()
  • 控制台输出被缓冲和同步,因为您不希望 2 个println语句在一行上混合输出

推荐阅读