Мьютекс (от англ. MUTual EXclusion) — это примитив синхронизации, используемый для обеспечения исключительного доступа к разделяемому ресурсу между конкурирующими горутинами. Он гарантирует, что в любой момент времени только одна горутина может владеть мьютексом и, соответственно, обращаться к защищаемым данным.
В Go пакет sync предоставляет два основных типа мьютексов:
sync.Mutex: Стандартный мьютекс. Предоставляет методы Lock() и Unlock(). Если мьютекс уже заблокирован, вызов Lock() блокирует текущую горутину до тех пор, пока он не будет освобожден. Unlock() разблокирует мьютекс.
go
sync.RWMutex: Мьютекс для чтения/записи. Позволяет множеству горутин одновременно читать защищаемый ресурс, но только одной горутине писать. Предоставляет методы Lock(), Unlock() (для записи), RLock() и RUnlock() (для чтения).
go
Использование мьютексов необходимо для предотвращения состояний гонки (race conditions), когда несколько горутин одновременно пытаются модифицировать одни и те же данные, приводя к непредсказуемым результатам.
Правила использования:
Lock() перед доступом к защищаемому ресурсу.Unlock() после завершения доступа. Рекомендуется использовать defer mu.Unlock() для гарантии разблокировки даже в случае паники.RWMutex, использовать RLock/RUnlock для операций чтения и Lock/Unlock для операций записи.Пример использования defer:
go