sync.Mutex — это взаимное исключение, которое гарантирует, что только одна горутина может одновременно получить доступ к критической секции кода. Это предотвращает гонки данных, когда несколько горутин конкурируют за общие ресурсы.
Стандартный паттерн для использования мьютекса очень простой:
var mu sync.Mutex
mu.Lock()
// критическая секция - только одна горутина выполняется здесь
mu.Unlock()
Когда вызывается Lock(), горутина получает исключительный доступ. Другие горутины, которые пытаются захватить тот же мьютекс, будут ждать, пока не будет вызван Unlock().
Всегда используй defer, чтобы гарантировать, что блокировка будет отпущена, даже если произойдёт паника:
mu.Lock()
defer mu.Unlock()
// критическая секция
Это гарантирует, что мьютекс будет разблокирован автоматически при выходе из функции.
Обычно ты защищаешь общую переменную, связывая её с мьютексом:
type Counter struct {
mu sync.Mutex
value int
}
func (c *Counter) Increment() {
c.mu.Lock()
defer c.mu.Unlock()
c.value++
}
sync.RWMutex — он позволяет нескольким читателям работать одновременноМьютекс — это фундаментальный примитив синхронизации в Go для безопасного управления доступом к общему состоянию.
Использование defer для разблокировки sync.Mutex гарантирует, что блокировка будет освобождена даже если внутри критической секции произойдёт паника.
Новый — ещё не проверен сообществом
Вы