Операция count++ выглядит одной, но состоит из трёх: прочитать значение, прибавить единицу, записать. Если два потока выполняют её одновременно, оба прочитают одно и то же значение — одно обновление потеряется.
AtomicInteger решает это через CAS (compare-and-swap): процессор атомарно записывает новое значение, только если текущее совпадает с ожидаемым. Если за это время значение изменил другой поток, операция повторяется с новым значением. Блокировок нет, потоки не засыпают, поэтому при умеренной конкуренции это быстрее synchronized.
Методы: incrementAndGet, addAndGet, compareAndSet, updateAndGet, accumulateAndGet. Есть AtomicLong, AtomicBoolean, AtomicReference.
volatile int эту задачу не решает: он гарантирует, что потоки увидят последнее записанное значение, но ++ над ним остаётся неатомарным.
При очень высокой конкуренции за один счётчик CAS начинает часто повторяться — для этого есть LongAdder, который распределяет счёт по ячейкам и суммирует при чтении.