Что выведет код Middle Потоки и Java Memory Model обновлено

Что выведет: synchronized и AtomicInteger

Вопрос

Что выведет программа (Java 21)? Каждый вывод println с новой строки.

import java.util.concurrent.atomic.AtomicInteger;

public class Main {
    private static int plain = 0;
    private static final Object lock = new Object();

    public static void main(String[] args) throws InterruptedException {
        AtomicInteger atomic = new AtomicInteger();
        Thread[] ts = new Thread[4];
        for (int i = 0; i < ts.length; i++) {
            ts[i] = new Thread(() -> {
                for (int j = 0; j < 10_000; j++) {
                    synchronized (lock) { plain++; }
                    atomic.incrementAndGet();
                }
            });
            ts[i].start();
        }
        for (Thread t : ts) t.join();
        System.out.println(plain);
        System.out.println(atomic.get());
        System.out.println(atomic.getAndAdd(5) + " " + atomic.addAndGet(5));
    }
}

Попробуйте сами

Напишите, что выведет код: каждый вывод с новой строки.

Показать ответ и разбор

Коротко

Код выведет: 40000, 40000, 40000 40010. Инкремент под общим монитором и incrementAndGet атомарны, обновления не теряются: 4 × 10 000. join гарантирует видимость результатов в main. getAndAdd(5) возвращает старое значение 40000 и делает 40005, addAndGet(5) прибавляет и возвращает…

Что выведет

40000
40000
40000 40010

Разбор

Инкремент под общим монитором и incrementAndGet атомарны, обновления не теряются: 4 × 10 000. join гарантирует видимость результатов в main. getAndAdd(5) возвращает старое значение 40000 и делает 40005, addAndGet(5) прибавляет и возвращает новое 40010.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме