以下是我的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
的同步与它有关吗?
答案 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场比赛。所以这种输出的概率非常低。至于为什么会这样,我猜它依赖于机器。