Что выведет код 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 ошибок.