Mutexes in Go

A Mutex (short for Mutual Exclusion) is a synchronization primitive used to ensure that only one goroutine can access a critical section of code at a time.

The sync.Mutex Type

Go’s standard library provides a built-in mutex implementation in the sync package.

  • .Lock(): Blocks other goroutines from entering the protected section.
  • .Unlock(): Releases the lock, allowing one waiting goroutine to enter.

Best Practice: defer

To prevent accidental deadlocks (forgetting to unlock), it is best practice to call Unlock() immediately after Lock() using the defer keyword.

func (sc *safeCounter) increment() {
    sc.mu.Lock()
    defer sc.mu.Unlock()
    
    // Everything below here is protected until the function returns
    sc.count++
}

Why use a Mutex?

Without a mutex, multiple goroutines might try to update the same memory location simultaneously, leading to race conditions and unpredictable behavior or crashes.