Lesson 28 — Sync Primitives
Mô phỏng sync.Mutex, sync.RWMutex và race condition trực tiếp trong trình duyệt.
1. Mutex simulator — Mutual Exclusion
N goroutine cùng cố vào Critical Section (CS). Mỗi lần chỉ 1 goroutine được vào;
những goroutine khác phải xếp hàng đợi Lock(). Bật toggle "không mutex" để xem race condition
làm counter sai số.
0
Lock acquired
0
Currently blocked
0
Inc() done
idle
CS owner
2. RWMutex — Reader/Writer Lock
Nhiều Reader có thể vào CS cùng lúc
(RLock). Khi Writer tới (Lock),
mọi reader phải rời và writer độc quyền CS. Đọc nhiều — ghi ít → RWMutex nhanh hơn Mutex thường.
0
Total reads
0
Total writes
0
Current readers
0
Current writer
3. Race condition — No sync vs Mutex vs Atomic
Hai goroutine cùng tăng counter, mỗi goroutine 1000 lần (kỳ vọng = 2000). Mỗi n++ là 3 bước:
read → add 1 → write. Khi không sync, hai goroutine
có thể đọc cùng giá trị → ghi đè lẫn nhau → mất update.
Goroutine A
read: —
add 1 → —
write
done: 0 / 1000
Shared counter (RAM)
0
expected = 2000
—
Goroutine B
read: —
add 1 → —
write
done: 0 / 1000
| Mode | Kết quả | Đúng? | ns/op (mock) |
|---|---|---|---|
no sync |
— | SAI | ~2 ns (nhưng kết quả sai) |
sync.Mutex |
— | đúng | ~15 ns |
atomic.Int64 |
— | đúng | ~5 ns |
Tóm tắt 3 module
- Mutex — đúng 1 owner vào CS, mọi goroutine khác chờ ở queue. Không lock → race, counter sai.
- RWMutex — nhiều reader song song khi không có writer; writer độc quyền, đẩy mọi reader ra trong lúc ghi.
- Race demo — không sync nhanh nhất nhưng cho kết quả SAI;
atomicđúng và nhanh hơnMutexcho counter đơn lẻ.