J'essaie simplement de tester l'initialisation de la sécurité de finale champs, tel que garanti par l'JLS. C'est pour un livre que je suis en train d'écrire. Cependant, je ne suis pas en mesure de l'obtenir pour "échouer" basé sur mon code actuel. Quelqu'un peut-il me dire ce que je fais mal, ou si c'est juste quelque chose que j'ai à courir encore et encore et puis voir un échec avec quelques malchanceux moment?
Voici mon code:
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);
}
}
}
et mon fils sont de l'appeler comme ceci:
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();
}
}
}
J'ai couru ce scénario beaucoup, beaucoup de fois. Mes boucles de courant sont de frai de 10 000 threads, mais je l'ai fait avec ce 1000, 100000, et même un million. Toujours pas d'échec. Je vois toujours les 3 et 4 pour les deux valeurs. Comment puis-je obtenir ce à l'échec?