class Task {

Результат не гарантированно равен 10000: counter++ не атомарен, и потоки могут терять обновления. join обеспечивает завершение и видимость, но не исправляет гонку инкремента.

Короткий ответ

Что ответить на собеседовании

Результат не гарантированно равен 10000: counter++ не атомарен, и потоки могут терять обновления. join обеспечивает завершение и видимость, но не исправляет гонку инкремента.

Подробный разбор

Ответ с пояснениями

Условие

class Task {

private static int counter = 0;

public static void main(String[] args) throws Exception {
    var thread1 = new Thread(() -> increase());
    var thread2 = new Thread(() -> increase());
    thread1.start();
    thread2.start();

    thread1.join();
    thread2.join();

    System.out.println(counter);
}

private static void increase() {
    for (int i = 0; i < 5000; i++) {
        counter++;
    }
}

}

Ответ

Результат не гарантированно равен 10000: counter++ не атомарен, и потоки могут терять обновления. join обеспечивает завершение и видимость, но не исправляет гонку инкремента.

Исправление через AtomicInteger:

private static final AtomicInteger counter = new AtomicInteger();

private static void increase() {
    for (int i = 0; i < 5000; i++) {
        counter.incrementAndGet();
    }
}

После обоих join печатают counter.get(), получая 10000. Нужен импорт java.util.concurrent.atomic.AtomicInteger. Альтернатива — один общий lock вокруг изменения; volatile int недостаточен, поскольку видимость не превращает read-modify-write в одну операцию.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее