What stops the system from descheduling one thread between the time it read the value and the time it wrote the value? Sure, it is less likely to happen, but on standard operating systems the kernel could get an interrupt at any time and decide that the other thread deserves to run. At that point, both threads would have read the same value and both will increment identically. However, the second thread could run for another time slice, incrementing thousands of times, and then when the first thread gets rescheduled, would zap all of the forward progress by the second thread by writing the stale value.