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ố.

Critical Section — empty — counter = 0 (expected = 0) Goroutines Wait queue
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.

Shared State (CS) — free — data = v0 Readers (RLock) Writers (Lock)
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: readadd 1write. 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