Без синхронизации counter++ может терять обновления, потому что чтение, увеличение и запись не атомарны. Synchronized защищает общий участок, а AtomicInteger предоставляет атомарное увеличение.
Подготовь пример: счётчик без синхронизации и с 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 не делает автоматически атомарной последовательность нескольких бизнес-операций.