Witam
Przeglądam sobie testy z SCJP i znalazłem ciekawe zadanie z wątków. Jednak nie do końca wiem co się dzieje.
Oto kod:
public class Cruiser {
private int a = 0;
public void foo() {
Runnable r = new LittleCruiser();
new Thread(r).start();
new Thread(r).start();
}
public static void main(String arg[]) {
Cruiser c = new Cruiser();
c.foo();
}
public class LittleCruiser implements Runnable {
public void run() {
int current = 0;
for (int i = 0; i < 4; i++) {
current = a;
System.out.print(current + ", ");
a = current + 2;
}
}
}
}
Oczywiście pytanie do kodu: Jaki będzie możliwy output?
A) 0, 2, 4, 0, 2, 4, 6, 6,
B) 0, 2, 4, 6, 8, 10, 12, 14,
C) 0, 2, 4, 6, 8, 10, 2, 4,
D) 0, 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 12, 14, 14,
E) 0, 2, 4, 6, 8, 10, 12, 14, 0, 2, 4, 6, 8, 10, 12, 14,
B - jest dla mnie oczywistością,
Jednak poprawną odpowiedzią jest również A.
Po kompilacji kodu i odpaleniu mam taki output: 0, 2, 4, 6, 0, 2, 4, 6,
Dodam że mam dwurdzeniowy procek.
Nie wiem skąd się biorą podwójne wartości wypisywane na ekran (np podówjne 0).
Przecież wątki korzystają z wartości tego samego pola a.
Proszę o jakieś sensowne i łopatologiczne wytłumaczenie.
Dzięki wielkie DD:D