Testando a segurança de inicialização dos campos finais
Estou tentando simplesmente testar a segurança de inicialização dos campos finais, conforme garantido pelo JLS. É para um trabalho que estou escrevendo. No entanto, não consigo 'falhar' com base no meu código atual. Alguém pode me dizer o que estou fazendo de errado, ou se isso é apenas algo que tenho que repetir várias vezes e depois ver um fracasso com algum tempo azarado?
Aqui está o meu código:
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);
}
}
}
e meus tópicos estão chamando assim:
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();
}
}
}
Eu executei esse cenário muitas e muitas vezes. Meus loops atuais estão gerando 10.000 threads, mas já fiz isso com 1000, 100000 e até um milhão. Ainda sem falhas. Eu sempre vejo 3 e 4 para ambos os valores. Como posso fazer isso falhar?