Я готовлюсь к экзамену и, пройдя несколько типовых упражнений (в которых есть правильные ответы), просто не могу понять их.
Вопрос
(множественный выбор): каковы некоторые из возможных результатов для программы ниже?
A)
Значение 1.
Значение 1.
Конечное значение 1.
В)
Значение 1.
Значение 1.
Конечное значение 2.
С)
Значение 1.
Конечное значение равно 1.
Значение равно 2.
D)
Значение 1.
Конечное значение 2.
Значение 2.
Программа
public class Thread2 extends Thread {
static int value = 0;
static Object mySyncObject = new Object();
void increment() {
int tmp = value + 1;
value = tmp;
}
public void run() {
synchronized(mySyncObject) {
increment();
System.out.print("Value is " + value);
}
}
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread2();
Thread t2 = new Thread2();
t1.start();
t2.start();
t1.join();
t2.join();
System.out.print("Final value is " + value);
}
}
Правильные ответы: A), C) и D).
Для случая А) Я не понимаю, как возможно, чтобы оба потока (после увеличения, казалось бы, статической переменной из синхронизированного блока (!)) В конечном итоге были установлены в 1, и, таким образом, конечное значение также равно 1. ..
Случаи C и D одинаково сбивают меня с толку, потому что я действительно не понимаю, как возможно, что main () завершает работу до того, как оба требуемых потока (t1 и t2) это делают. Я имею в виду, что их методы join () были вызваны из функции main, поэтому, насколько я понимаю, функция main должна ждать, пока оба t1 и t2 будут выполнены с их методом run () (и, таким образом, их значения будут напечатаны) ... ??
Было бы замечательно, если бы кто-нибудь мог мне помочь в этом.
Заранее спасибо, высоко ценится!
васаби