A computação distribuída consiste em tempo e estado. Isto é, para que mais de um componente se comunique, é necessário compartilhar o estado, o que exige tempo.
A maioria dos programadores antropomorfiza seu trabalho. Eles enxergam um thread de controle executando todo o programa da mesma forma como enxergariam a si mesmos fazendo o trabalho inteiro por conta própria. Computadores modernos, entretanto, alternam entre tarefas com muita rapidez e, em sistemas multi-core, multi-CPU ou distribuídos, dois eventos podem ocorrer exatamente ao mesmo tempo. Defeitos rapidamente são postos nas lacunas entre o modelo do programador de como um programa é executado e o que ocorre na realidade. Esses defeitos estão relacionados com interações inesperadas entre threads, processos, tempo e informações. Essas interações ocorrem por meio de estados compartilhados: semáforos, variáveis, o sistema de arquivos e, basicamente, todas as coisas capazes de armazenar informações.
Race Condition: Format Flaw
parse()
e format()
em java.text.Format
contêm uma falha de design que pode fazer com que um usuário veja os dados de outro usuário.parse()
e format()
em java.text.Format
contêm uma condição de corrida que pode fazer com que um usuário veja os dados de outro usuário.Exemplo 1: O código a seguir mostra como essa falha de design pode se manifestar.
public class Common {
private static SimpleDateFormat dateFormat;
...
public String format(Date date) {
return dateFormat.format(date);
}
...
final OtherClass dateFormatAccess=new OtherClass();
...
public void function_running_in_thread1(){
System.out.println("Time in thread 1 should be 12/31/69 4:00 PM, found: "+ dateFormatAccess.format(new Date(0)));
}
public void function_running_in_thread2(){
System.out.println("Time in thread 2 should be around 12/29/09 6:26 AM, found: "+ dateFormatAccess.format(new Date(System.currentTimeMillis())));
}
}
Embora esse código se comporte corretamente em um ambiente de usuário único, se dois threads puderem executá-lo ao mesmo tempo, eles poderão produzir a seguinte saída:
O horário em thread 1 deve ser 12/31/69 4:00 PM, encontrado: 12/31/69 4:00 PM
O horário em thread 2 deve ser por volta de 12/29/09 6:26 AM, encontrado: 12/31/69 4:00 PM
Nesse caso, a data do primeiro thread é mostrada na saída do segundo thread devido a uma condição de corrida na implementação de
format()
.