Mutex


🧠 1. Mutex là gì?

Trong Go, Mutex (mutual exclusion) được dùng để bảo vệ dữ liệu chia sẻ giữa nhiều goroutine. Nó đảm bảo rằng chỉ một goroutine được phép truy cập vào "vùng critical" tại một thời điểm.

👉 Import từ đâu?

import "sync"

🧩 2. Cách dùng Mutex – Code thực tế

package main

import (
    "fmt"
    "sync"
)

var (
    counter int
    mutex   sync.Mutex
)

func main() {
    var wg sync.WaitGroup

    for i := 0; i < 1000; i++ {
        wg.Add(1)
        go func() {
            // Vào critical section
            mutex.Lock()
            counter++
            mutex.Unlock()
            wg.Done()
        }()
    }

    wg.Wait()
    fmt.Println("Counter:", counter)
}

✅ Điều gì đang xảy ra?

  • Có 1000 goroutine tăng biến counter.

  • mutex.Lock() đảm bảo chỉ 1 goroutine tại 1 thời điểm được truy cập counter.

  • Sau khi xong, mutex.Unlock() mở khóa cho thằng tiếp theo.


⚠️ 3. Những sai lầm phổ biến cần tránh

Sai lầm
Hậu quả

Quên gọi Unlock()

Goroutine khác bị block mãi mãi (deadlock)

Gọi Unlock() mà chưa Lock()

Panic: unlock of unlocked mutex

Lock/Unlock theo logic điều kiện

Dễ bị quên unlock ở nhánh nào đó


🧪 4. Dùng với defer – chuẩn bài cho production

mutex.Lock()
defer mutex.Unlock()

Điều này giúp đảm bảo Unlock() luôn được gọi dù có panic hay return giữa chừng, tránh deadlock.


🧵 5. Mutex vs RWMutex – chọn đúng công cụ

  • sync.Mutex: dành cho read/write chung một khóa

  • sync.RWMutex: cho phép nhiều goroutine đọc đồng thời, nhưng chỉ một thằng được ghi

var rw sync.RWMutex

// Read
rw.RLock()
// đọc data
rw.RUnlock()

// Write
rw.Lock()
// ghi data
rw.Unlock()

🛠️ 6. Khi nào dùng Mutex?

  • Khi có biến toàn cục hoặc dữ liệu chia sẻ giữa nhiều goroutine.

  • Khi performance quan trọng và bạn muốn tránh overhead của channel.

  • Khi truy cập file, DB connection pool, hoặc cấu trúc dữ liệu như map.


🧠 7. Mutex hay Channel? – Tư duy của Senior Dev

Tình huống
Dùng gì?
Lý do

Dữ liệu chia sẻ (shared state)

Mutex

Truy cập trực tiếp, performance cao

Truyền thông điệp (message passing)

Channel

Go-style idiomatic, dễ quản lý logic

Truy cập đọc nhiều, ghi ít

RWMutex

Performance tốt hơn

Đồng bộ goroutine

sync.WaitGroup

Không dùng Mutex


✅ Kết luận

Mutex là công cụ low-level, nhưng cực kỳ mạnh. Khi hiểu rõ cách hoạt động, bạn sẽ tránh được các lỗi khó chịu như race condition, deadlock, và panic. Tuy nhiên, cần cẩn thận khi dùng — viết code dễ đọc, maintain được là ưu tiên hàng đầu.


Last updated