Я пытаюсь просто проверить безопасность инициализации конечных полей, как это гарантировано 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 и даже миллионом. Все еще нет провала. Я всегда вижу 3 и 4 для обоих значений. Как я могу заставить это потерпеть неудачу?