Выбор ответа Middle sync и атомики обновлено
Атомики или мьютекс
Вопрос
Нужно хранить баланс и число операций и обновлять их вместе. Почему двух atomic.Int64 недостаточно?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Каждое поле атомарно, но пара нет: виден новый баланс и старый счётчик. Атомарность одной операции не даёт атомарности группы операций.
Варианты ответа
- atomic.Int64 не выравнивается и ломается на 32-битных системах
- Два атомика медленнее одного мьютекса, выгоды нет
- Каждое поле атомарно, но пара нет: виден новый баланс и старый счётчикправильный ответ
- Достаточно: атомики дают общий порядок, проблем нет
Разбор
Атомарность одной операции не даёт атомарности группы операций. Инвариант между двумя полями требует мьютекса (или одного атомарного указателя на неизменяемую структуру, которую заменяют целиком через CAS). Типы atomic.Int64 выравнены и корректны и на 32-битных платформах. Атомики обычно быстрее мьютекса, дело не в скорости.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Ещё по теме «sync и атомики»
- Глобальный максимум через CompareAndSwap
- Конкурентные переводы между счетами без дедлока
- Шардированная мапа с мьютексом на шард
- Что выведет Go: atomic.Int64 из 100 горутин
- Что выведет Go: sync.Once и OnceValue
- Код-ревью Go: кеш на RWMutex
- Код-ревью Go: ленивый синглтон и горячая перезагрузка конфига
- Флаг без синхронизации