Вопрос проверяет опыт работы с check-then-act
Проверка и действие должны быть в одной критической секции. Если проверку делать без блокировки, то два запроса могут пройти проверку и оба записать, нарушив инвариант.
Сценарий: «если свободно → занять».
Неправильно:
if free(id) — без локов;
lock(); write(); unlock().
Между 1 и 2 другой поток тоже прошёл 1.
Правильно:
внутри одного Lock():
проверить условие;
выполнить изменение;
сохранить состояние;
только после этого отпустить замок.
Вывод: атомарность — это «проверка+действие», а не только «действие».