Uma race condition é um bug em que o resultado depende do timing imprevisível de operações concorrentes que acessam estado compartilhado. O caso clássico é um read-modify-write que não é atômico.
Como funciona
counter += 1 parece atômico mas na verdade são três passos: ler, somar, escrever. Duas threads podem se intercalar de modo que uma atualização se perca.
counter = 0
Thread A: read 0 ─────────── write 1
Thread B: read 0 ─ write 1
Result: 1 (should be 2 — one increment lost)
