私の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
がないと3つの結果しかありません。どんなに私は、コードを実行する回数
= 0、B = 0
= 0、B = 1
= 1、B = 1
、常に取得同じ結果。では、出力がない理由は何ですか?a=1, b=0
? println
の同期はそれとは関係がありますか?
スレッドインターリーブをルックアップします。 2つのスレッドが順番に開始されるため、同じ順序で実行することは保証されません。したがって、変数を設定するスレッドは、システムが印刷スレッドに切り替える前に9000回実行される可能性があります。または、出力に 'a = 0、b = 1'などの変数が1つ設定された後に発生する可能性があります。 – kjsebastian
プログラムを実行しようとしましたが、77%a = 1、b = 1、23%a = 0 、b = 0、a = 0、b = 1、および_no_a = 1、b = 0というわずかな数の結果が得られます。したがって、これは実装とマシンに依存しているようです。 – ajb
コードが何をしていると思いますか?あなたはそれをデバッガでステップスルーしたり、追加の出力を追加することができます。もっと。特定の、yoyは出力が期待通りではないと言いました。あなたは何を期待していますか? – David