Java 言語仕様の例を自分で試してみたかったのですが、どうやらわからないことがあります。私の理解では、揮発性カウンターのインクリメントの順序は、コードに表示される順序と同じでなければならないということでした。「驚いたことに」私は、あるカウンターが他のカウンターよりも小さい、等しい、大きいという点で、ランダムなカウンター値を取得しています。私が欠けているものを説明できる人はいますか?
以下のコードと出力:
public class C {
private static volatile int i = 0;
private static volatile int j = 0;
static void one() {
i++;
j++;
}
static void two() {
int a = i;
int b = j;
if(a < b)
System.out.println(a + " < " + b);
if(a > b)
System.out.println(a + " > " + b);
if(a == b)
System.out.println(a + " = " + b);
}
public static void main(String[] args) throws Exception {
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
while(true)
one();
}
});
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
while(true)
two();
}
});
t1.start();
t2.start();
Thread.sleep(5000);
System.exit(0);
}
}
出力
214559700 > 214559699
214559807 > 214559806
214559917 > 214559916
214560019 = 214560019
214560137 > 214560136
214560247 = 214560247
214560349 > 214560348
214560455 = 214560455
214560561 > 214560560
214560670 = 214560670
214560776 = 214560776
214560886 > 214560885
214560995 = 214560995
214561097 < 214561098