Синхронизированный метод делает свою работу правильно. Проблема в том, что вы не ждете второго Thread
. count
может быть напечатано до , второй поток завершается, поэтому вы также должны добавить t2.join();
:
try {
t1.join();
t2.join();
} catch (InterruptedException e) { ... }
Давайте рассмотрим более интересную версию вашего метода:
private void doWork() throws InterruptedException {
final int n = 2;
final CountDownLatch latch = new CountDownLatch(n);
final ExecutorService service = Executors.newFixedThreadPool(n);
final Runnable task = () -> {
for (int i = 0; i < 10000; i++) {
synchIncrement();
}
latch.countDown();
};
for (int i = 0; i < n; ++i) {
service.execute(task);
}
latch.await();
service.shutdown();
System.out.println(count);
}
Я ввел ExecutorService
фиксированного размера, чтобы не создавать темы самостоятельно. Я написал CountDownLatch
, чтобы знать, когда все задачи завершат выполнение, чтобы я мог закрыть службу и распечатать результат.