Race condition: как воспроизвести и как бороться?

Ответ

Check-then-act без атомарности: if (map.containsKey(k)) map.get(k). Между проверкой и получением другой поток может изменить состояние. Решение: единая атомарная операция computeIfAbsent. Воспроизвести: запустить много потоков на общей мапе (гонка проявляется даже на одном ядре из-за вытеснения планировщиком).

Разбор: Проблема check-then-act в том, что две отдельные атомарные операции (containsKey и get) не атомарны вместе — между ними другой поток может изменить состояние. Правильное решение — единая атомарная операция вроде computeIfAbsent. volatile обеспечивает только видимость, но не атомарность составных действий; ConcurrentHashMap делает атомарной каждую отдельную операцию, но не их комбинацию; а гонки прекрасно воспроизводятся и на одном ядре из-за вытеснения потоков планировщиком.

Хочешь так же по своей компании — с вопросами по грейдам и задачами? Закажи гайд или забери свежее в Telegram.

Заказать гайд Пройти тест
новые гайды и свежие вопросы с собесов — первыми в Telegram Смотреть гайды Подписаться