我的java代码的输出不符合预期?

时间:2016-10-26 04:04:18

标签: java

以下是我的java代码。

public class TestVolatile {

    static class Test {
        int a = 0;
        int b = 0;
    }

    public static void main(String[] args) {

        for(int i=0;i<10000;i++) {
            final Test test = new Test();
            new Thread(new Runnable() {
                @Override
                public void run() {
                    test.a = 1; //test.a assignment before test.b assignment
                    test.b = 1;
                }
            }).start();
            new Thread(new Runnable() {
                @Override
                public void run() {
                    System.out.println("a="+test.a+",b="+test.b);
                }
            }).start();
        }
    }
}

我只想找出java com.company.test_volatile.TestVolatile | sort -u的所有可能输出。但是只有三个结果没有a=1, b=0

  

a = 0,b = 0
  a = 0,b = 1
  a = 1,b = 1

无论我运行多少次代码,总是得到相同的结果。那么没有输出a=1, b=0的原因是什么? println的同步与它有关吗?

1 个答案:

答案 0 :(得分:0)

我不得不暴力破解它。可能有更好的方法。我得到一个输出,其中a = 1,b = 0。

$ for i in {1..1000}; do java TestVolatile | grep 'a=1,b=0'; done                                                                                                   
a=1,b=0
a=1,b=0
a=1,b=0
a=1,b=0
a=1,b=0

它还在继续。如果我得到更多的话,我会更新

更新:我从运行1000 * 1000次获得了5场比赛。所以这种输出的概率非常低。至于为什么会这样,我猜它依赖于机器。