Задать вопрос
evgeniy8705
@evgeniy8705
Повелитель вселенной

Почему выводится не то что ожидается (Потоки)?

Только пытаюсь разобраться с многопоточностью.
Попробовал сделать небольшой пример:
public class App {
    public static final int N = 10_000_000;
    public static int counter = 0;

    public static void inc() {
        counter++;
    }

    public static void main(String[] args) throws InterruptedException {
        Object obj = new Object();

        Thread t0 = new Thread(() -> {
            synchronized (obj) {
                for (int i = 0; i < N; i++) {
                    inc();
                }
            }
        });

        t0.start();

        Thread t1 = new Thread(() -> {
            synchronized (obj) {
                for (int i = 0; i < N; i++) {
                    inc();
                }
            }
        });

        t1.start();

//        t0.join();
//        t1.join();

        System.out.println(counter);
    }
}


Почему без join(), программа выполняется не так как ожидалось? Сделал 2 потока. Внутри у каждого есть синхронизированный блок по одному и тому же объекту. Я ожидал что будет работать так: Так как синхронизированны по одному и тому же объекту, то потоки не будут друг другу мешать. Сначала завершится одни, потом начнет работать другой. И в результате будет выведено число 20_000_000. Но не знаю теперь почему работает не так как я думал.

Объясните как работает данная программа. И что значит метод join? Я думал что он означает, что сначала завершится один потом, потом начнет работать другой. Правильно ли я понял? И почему тогда не работает так как я описал выше, по моему синхронизация по одному объекту, это тоже самое что ждать завершения работы другого потока (в приведенном примере).
  • Вопрос задан
  • 169 просмотров
Подписаться 1 Оценить Комментировать
Решения вопроса 1
t0 запустил - он начал инкремент,
следом t1,
и сразу на печать вот до скольки успели досчитать потоки столько и вывел
если убрать коммент, то программа ожидает что закончится поток 0, потом запустит поток 1, и потом выведет результат в консоль
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы