Я готовлюсь к экзамену и, пройдя несколько примеров упражнений (в которые включены правильные ответы), я просто не могу понять их смысл.
(Множественный выбор): Каковы некоторые из возможных результатов для программы ниже?
A) Значение равно 1. Значение равно 1. Конечное значение 1.
B) Значение равно 1. Значение равно 1. Конечное значение - 2.
C) Значение равно 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).
Для случая A) я не понимаю, как это возможно, что оба потока (после увеличения кажущегося статического переменная из синхронизированного блока (!)) в конечном итоге устанавливается равным 1, и, таким образом, конечное значение тоже равно 1 ...?
Варианты C и D одинаково сбивают меня с толку, потому что я действительно не понимаю, как это возможно, что main () завершится раньше, чем оба требуемых потока (t1 и t2). Я имею в виду, что их методы join () были вызваны из основной функции, поэтому, насколько я понимаю, основная функция должна ждать, пока оба t1 и t2 не будут выполнены с их методом run () (и, таким образом, будут напечатаны их значения) ... ??
Было бы здорово, если бы кто-нибудь помог мне в этом.
Заранее спасибо, очень признателен! wasabi