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?
🧩 2. Cách dùng Mutex – Code thực tế
✅ Đ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ậpcounter
.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
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
defer
– chuẩn bài cho productionĐ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óasync.RWMutex
: cho phép nhiều goroutine đọc đồng thời, nhưng chỉ một thằng được ghi
🛠️ 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
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