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