Quando múltiplas threads compartilham um objeto e ele é modificado por uma ou várias delas, podem ocorrer resultados indeterminados (como veremos nos exemplos mais adiante), a menos que o acesso ao objeto compartilhado seja gerenciado adequadamente.
Quando isso acontecer, não se pode confiar no comportamento do programa, uma vez que ele poderá produzir tantos resultados corretos quanto resultados errados, e da pior maneira possível, esporadicamente.
Isso significa que o programa às vezes funciona e às vezes não. Além disso, essa oscilação entre funcionar e não funcionar não possui um padrão de comportamento, o que torna a descoberta do problema algo ainda mais complexo.