Я читаю «Параллелизм Java на практике» и смотрю пример кода на стр. 51.
Это говорит о том, что если поток имеет ссылки на общий объект, то другие потоки могут иметь доступ к этому объекту до того, как конструктор завершит выполнение.
Я пытался применить это на практике, и поэтому я написал этот код, думая, что, если я запустил его достаточно раз, возникнет исключение RuntimeException ("World is f * cked"). Но это не так.
Это тот случай, когда спецификация Java не гарантирует что-то, а моя конкретная реализация java гарантирует это для меня? (версия Java: 1.5.0 в Ubuntu) Или я что-то неправильно прочитал в книге?
Код: (я ожидаю исключения, но оно никогда не выдается)
public class Threads {
private Widgit w;
public static void main(String[] s) throws Exception {
while(true){
Threads t = new Threads();
t.runThreads();
}
}
private void runThreads() throws Exception{
new Checker().start();
w = new Widgit((int)(Math.random() * 100) + 1);
}
private class Checker extends Thread{
private static final int LOOP_TIMES = 1000;
public void run() {
int count = 0;
for(int i = 0; i < LOOP_TIMES; i++){
try {
w.checkMe();
count++;
} catch(NullPointerException npe){
//ignore
}
}
System.out.println("checked: "+count+" times out of "+LOOP_TIMES);
}
}
private static class Widgit{
private int n;
private int n2;
Widgit(int n) throws InterruptedException{
this.n = n;
Thread.sleep(2);
this.n2 = n;
}
void checkMe(){
if (n != n2) {
throw new RuntimeException("World is f*cked");
}
}
}
}