synchronized | volatile | |
|---|---|---|
| Mutual exclusion | Có — 1 thread vào block | Không |
| Atomicity (compound op) | Có | Không |
| Visibility (memory) | Có | Có — |
| Cost | Đắt (lock contention, context switch) | Rẻ (memory barrier) |
synchronized dùng cho: critical section đa bước, compound op (count++, check-then-act).
volatile dùng cho: boolean flag, reference immutable object, singleton DCL.
java
// synchronized
synchronized (lock) { count++; } // atomic + visible
// volatile — chỉ visible, KHÔNG atomic
volatile boolean stop = false; // OK cho flag
volatile int count;
count++; // BAD: vẫn raceHiện đại: cần atomicity → dùng AtomicInteger/AtomicReference (CAS, rẻ hơn synchronized). Cần lock có timeout/fairness → ReentrantLock.
volatile không phải "synchronized rẻ" — chỉ giải quyết visibility, không phải mutex.