Acesso Concorrente e Seus Problemas
Você já sabe proteger uma seção crítica: envolve o acesso compartilhado num
mutex, ou num bloco synchronized, e a exclusão mútua garante que o contador soma
1000000 toda vez. Mas até agora tratamos os bugs que o lock previne de forma
meio informal, chamando tudo de “as threads pisaram umas nas outras”.
Este capítulo dá nomes precisos a esses bugs, e separa conceitos que vivem sendo confundidos, mesmo por programadores experientes. Data race e race condition não são a mesma coisa, apesar de quase todo mundo usar os dois termos como sinônimos. Um pode existir sem o outro, e a diferença muda o jeito de raciocinar sobre o problema e sobre a correção. Por baixo dos dois está a noção de seção crítica, que já usamos na prática e que agora vale definir com cuidado.
Saber usar o mutex é metade do trabalho. A outra metade é reconhecer, no seu próprio código, quais acessos são perigosos e por quê, e é disso que trata este capítulo.