Mutex в Go это инструмент синхронизации, который используется для того, чтобы в один момент времени только одна горутина (легковесный поток выполнения) могла получить доступ к какому-либо ресурсу. Используется для предоствращения состояния гонки (race condition).
С помощью Mutex можно обеспечить, что важные операции с данными происходят строго поочередно, что важно в многопоточном программировании, особенно в Go, где активно используется конкурентность.
Mutex
стоит за аббревиатурой «mutual exclusion», что в переводе означает «взаимное исключение».
sync — пакет для работы с Mutex
Основной пакет для работы с мьютексами в Go — sync
. Mutex
из этого пакета предоставляет два основных метода: Lock()
и Unlock()
.
Lock()
блокирует mutex
, если он не заблокирован. Но ждет, если он уже заблокирован, до тех пор, пока не будет разблокирован другой горутиной.
После того как mutex
заблокирован вызывающей горутиной, никакая другая горутина не может получить к нему доступ до тех пор, пока он не будет разблокирован с помощью Unlock()
.
Это обеспечивает безопасный доступ к данным, защищая их от одновременных изменений.
Пример использования Mutex
Пример использования mutex
для безопасного обновления общих данных между горутинами:
package main
import (
"fmt"
"sync"
)
var (
// Общий ресурс, доступ к которому нужно синхронизировать
counter int
// Mutex для синхронизации доступа к counter
mu sync.Mutex
)
func main() {
var wg sync.WaitGroup
// Запускаем 1000 горутин, каждая из которых увеличивает counter на 1
for i := 0; i < 1000; i++ {
wg.Add(1)
go func() {
defer wg.Done()
mu.Lock() // Блокируем доступ к counter
counter++ // Безопасно увеличиваем counter
mu.Unlock() // Освобождаем доступ
}()
}
wg.Wait() // Ждем завершения всех горутин
fmt.Println("Значение counter после 1000 увеличений:", counter)
}
В примере Mutex
гарантирует, что каждое увеличение счетчика происходит атомарно, предотвращая возможные проблемы синхронизации, которые могли бы возникнуть при одновременном доступе к переменной counter
из нескольких горутин.
Другие примеры Mutext
- Mutex встроенный в структуру:
type MemoryStorage struct {
counter int
data map[int]User
sync.Mutex
}
- sync.Mutex на go.dev