Выбор ответа Junior sync и атомики обновлено
Повторный Lock в той же горутине
Вопрос
Что произойдёт, если горутина, уже держащая sync.Mutex, вызовет Lock ещё раз?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Дедлок: мьютекс в Go не реентерабельный. Mutex в Go не знает владельца и не поддерживает повторный захват: вторая попытка ждёт освобождения, которого никогда не будет.
Варианты ответа
- Дедлок: мьютекс в Go не реентерабельныйправильный ответ
- Ничего, счётчик блокировок увеличится
- panic: mutex already locked
- Второй Lock будет проигнорирован
Разбор
Mutex в Go не знает владельца и не поддерживает повторный захват: вторая попытка ждёт освобождения, которого никогда не будет. Если это единственная работающая горутина, рантайм сообщит о deadlock, иначе сервис просто повиснет. Паники нет. Решение: разделить публичные методы (берут блокировку) и внутренние (lockedXxx, ожидают, что блокировка уже взята).
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Ещё по теме «sync и атомики»
- Глобальный максимум через CompareAndSwap
- Конкурентные переводы между счетами без дедлока
- Шардированная мапа с мьютексом на шард
- Что выведет Go: atomic.Int64 из 100 горутин
- Что выведет Go: sync.Once и OnceValue
- Код-ревью Go: кеш на RWMutex
- Код-ревью Go: ленивый синглтон и горячая перезагрузка конфига
- Типизированные атомики