A race condition is a bug where the outcome depends on the timing of two or more threads. When they touch shared data and the order is not controlled, results vary run to run.
Take two threads each reading a counter, adding one, and writing back. If both read the same value before either writes, one increment is lost. The count is wrong only for certain interleavings.
It hides because the bad interleaving is rare. Scheduling is nondeterministic and shifts with load, timing, and the machine. A test can pass thousands of times and still fail in production.
That nondeterminism is exactly why rerunning does not debug a race. You fix it by reasoning about shared state and adding synchronization, not by hunting for the one crash.
This answer doesn't lend itself to a diagram - it reads best . No credits were charged.
Why there's no diagram: “”
The interactive diagram is below the answer - jump to diagram ↓ · Below it, the related concept . Jump to it ↓
The diagram below the answer is the concept . Jump to it ↓