Прочитайте код, определите, завершится ли выполнение программы и что будет выведено в конце в лог

В представленном коде есть ошибка: переменные counter1 и counter2 объявлены как AtomicInteger, но инициализируются как int (0), что вызовет ошибку компиляции. Правильно было бы:

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

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

В представленном коде есть ошибка: переменные counter1 и counter2 объявлены как AtomicInteger, но инициализируются как int (0), что вызовет ошибку компиляции. Правильно было бы:

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

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

Условие

Прочитайте код, определите, завершится ли выполнение программы и что будет выведено в конце в лог

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class Increment {
    private static AtomicInteger counter1 = 0;
    private static AtomicInteger counter2 = 0;

    public static void main(String[] args) throws InterruptedException {
        int tasksCount = 100_000;
        CountDownLatch latch = new CountDownLatch(tasksCount);
        ExecutorService executor = Executors.newFixedThreadPool(100);

        for (int i = 0; i < tasksCount; i++) {
            executor.submit(() -> {
                counter1.incrementAndGet();
                counter2.incrementAndGet();
                latch.countDown();
            });
        }

        latch.await();

        System.out.println(counter1);
        System.out.println(counter2);
        System.exit(0);
    }
}

Ответ

В представленном коде есть ошибка: переменные counter1 и counter2 объявлены как AtomicInteger, но инициализируются как int (0), что вызовет ошибку компиляции. Правильно было бы:

private static AtomicInteger counter1 = new AtomicInteger(0);
private static AtomicInteger counter2 = new AtomicInteger(0);

Если исправить это, то программа создаст 100_000 задач, каждая из которых увеличит оба счетчика на 1 и уменьшит CountDownLatch.

ExecutorService с 100 потоками будет выполнять задачи параллельно.

После того, как все задачи завершатся (latch.await()), программа выведет значения counter1 и counter2.

Поскольку AtomicInteger обеспечивает атомарное инкрементирование, оба счетчика будут равны 100_000.

В итоге в логе будет:

100000
100000

И программа завершится вызовом System.exit(0).

Если не исправлять инициализацию, программа не скомпилируется.

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

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

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

Подробнее