Только пытаюсь разобраться с многопоточностью.
Попробовал сделать небольшой пример:
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? Я думал что он означает, что сначала завершится один потом, потом начнет работать другой. Правильно ли я понял? И почему тогда не работает так как я описал выше, по моему синхронизация по одному объекту, это тоже самое что ждать завершения работы другого потока (в приведенном примере).