Подготовь пример: счётчик без синхронизации и с Synchronized/AtomicInteger, объясни какие баги возможны без синхронизации

Без синхронизации counter++ может терять обновления, потому что чтение, увеличение и запись не атомарны. Synchronized защищает общий участок, а AtomicInteger предоставляет атомарное увеличение.

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

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

Без синхронизации counter++ может терять обновления, потому что чтение, увеличение и запись не атомарны. Synchronized защищает общий участок, а AtomicInteger предоставляет атомарное увеличение.

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

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

Без синхронизации counter++ может терять обновления, потому что чтение, увеличение и запись не атомарны. Synchronized защищает общий участок, а AtomicInteger предоставляет атомарное увеличение.

Три альтернативы:

class UnsafeCounter {
    int value;
    void increment() { value++; }
}
class LockedCounter {
    private int value;
    synchronized void increment() { value++; }
    synchronized int get() { return value; }
}
class AtomicCounter {
    private final java.util.concurrent.atomic.AtomicInteger value =
        new java.util.concurrent.atomic.AtomicInteger();
    void increment() { value.incrementAndGet(); }
    int get() { return value.get(); }
}

Два потока могут прочитать одинаковое старое число и записать одинаковый результат вместо двух увеличений. Возможны и проблемы видимости. volatile int сам по себе не делает ++ атомарным. Защищать нужно все обращения к разделяемому состоянию согласованным способом; AtomicInteger не делает автоматически атомарной последовательность нескольких бизнес-операций.

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

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

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

Подробнее