Этот вопрос проверяет знание инструментов Java для безопасной работы с общими данными в многопоточной среде.
Атомарность обеспечивается с помощью синхронизации, блокировок или атомарных классов. Самый простой способ — synchronized. Более гибкий вариант — Lock. Для счётчиков и простых операций лучше использовать классы из java.util.concurrent.atomic. Выбор подхода зависит от задачи и требований к производительности.
Атомарность означает, что операция выполняется:
целиком
неделимо
без вмешательства других потоков
Перед выбором подхода важно оценить сложность операции и нагрузку.
synchronizedСамый базовый и надёжный способ.
synchronized void increment() {
counter++;
}
Особенности:
прост в использовании
может снижать производительность
блокирует потоки на уровне монитора
Lock (ReentrantLock)Более гибкая альтернатива.
lock.lock();
try {
counter++;
} finally {
lock.unlock();
}
Преимущества:
tryLock
таймауты
явный контроль блокировки
Подходят для простых операций без сложной логики.
AtomicInteger counter = new AtomicInteger();
counter.incrementAndGet();
Особенности:
не используют блокировки
основаны на CAS
хорошо масштабируются
Простые счётчики → Atomic*
Критические секции → synchronized
Сложная логика → Lock
Атомарность достигается разными средствами. Правильный выбор зависит от сценария и требований к производительности.