В представленном коде есть ошибка: переменные 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).
Если не исправлять инициализацию, программа не скомпилируется.