JLSによって保証されているように、最終フィールドの初期化の安全性を簡単にテストしようとしています。私が書いている論文用です。ただし、現在のコードに基づいて「失敗」させることはできません。誰かが私が間違っていることを教えてもらえますか、それともこれが私が何度も何度も何度も実行しなければならないことであり、それからいくつかの不運なタイミングで失敗を見る必要がありますか?
これが私のコードです:
public class TestClass {
final int x;
int y;
static TestClass f;
public TestClass() {
x = 3;
y = 4;
}
static void writer() {
TestClass.f = new TestClass();
}
static void reader() {
if (TestClass.f != null) {
int i = TestClass.f.x; // guaranteed to see 3
int j = TestClass.f.y; // could see 0
System.out.println("i = " + i);
System.out.println("j = " + j);
}
}
}
そして私のスレッドはそれを次のように呼んでいます:
public class TestClient {
public static void main(String[] args) {
for (int i = 0; i < 10000; i++) {
Thread writer = new Thread(new Runnable() {
@Override
public void run() {
TestClass.writer();
}
});
writer.start();
}
for (int i = 0; i < 10000; i++) {
Thread reader = new Thread(new Runnable() {
@Override
public void run() {
TestClass.reader();
}
});
reader.start();
}
}
}
私はこのシナリオを何度も実行しました。私の現在のループは10,000スレッドを生成していますが、これは1000、100000、さらには100万を使用しています。それでも失敗はありません。両方の値に常に3と4が表示されます。どうすればこれを失敗させることができますか?