Как работает join ()? (Многопоточность в Java)

Я готовлюсь к экзамену и, пройдя несколько примеров упражнений (в которые включены правильные ответы), я просто не могу понять их смысл.

Вопрос

(Множественный выбор): Каковы некоторые из возможных результатов для программы ниже?

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

12
задан pkluz 4 February 2011 в 15:20
поделиться