Você notou Race Condition no exemplo de simultaneidade multi-threading do Java? Como lidar com isso?

Publicados: 2019-12-11

tem-você-notou-race-condition-in-java-multi-threading-concurrency-exemplo

Algum tempo atrás eu escrevi um artigo sobre o exemplo do consumidor do produtor e como lidar melhor com a operação de leitura/gravação em Java. Na mesma nota, neste tutorial discutiremos algo sobre Race Condition e Thread locking .

Se você tem alguma das perguntas abaixo, então você está no lugar certo:

  • Exemplo de condição de corrida Java
  • exemplo java mutex
  • multithreading – O que é uma condição de corrida?
  • Condições de Corrida e Seções Críticas
  • O que é condição de corrida?
  • Como lidar com a condição de corrida em Java com exemplo

Por que a condição de corrida em Java ocorre?

A condição de corrida em Java ocorre quando two or more threads tentam modificar/atualizar dados compartilhados ao same time .

Vamos dar uma olhada na lógica do programa abaixo:

Este é um exemplo bancário muito simples no qual você deposit e withdraw quantias 100 times . Você depositará $ 100 no total 100 vezes = $ 100 x 100 = $ 10.000 e retirará $ 50 no total 100 vezes = $ 50 x 100 = $ 5.000. No final da conclusão do programa, você deve ter $ 5.000 em seu banco.

Aqui estão os passos:

  1. Criar classe CrunchifyRaceCondition.java
  2. Criar classe CrunchifyTransaction.java
  3. Criar classe CrunchifyBankAccount.java
  4. Executaremos a classe CrunchifyRaceCondition e ela iniciará o loop de depósito e retirada 100 vezes.
  5. Vamos executá-lo with Synchronized block para verificar o resultado
  6. Vamos executá-lo without Synchronized block para verificar o resultado

CrunchifyRaceCondition.java

CrunchifyTransaction.java

CrunchifyBankAccount.java

Verifique as linhas 24 e 34 acima. Mantenha essa palavra-chave Synchronized e execute seu programa. Você deve ver o resultado correto como você vê na imagem abaixo.

Palavra-chave de bloco sincronizado Java - Crunchify

Agora remova a palavra-chave sincronizada das linhas 24 e 34 e execute o mesmo programa.

Pode ser necessário executar este programa várias vezes para ver um problema. Em java, não há garantia de que você verá condição de corrida o tempo todo.

Java sem palavra-chave de bloco sincronizado - Crunchify

Se você tem um aplicativo de nível empresarial e está falando de milhões de transações por segundo, a condição de corrida pode causar um desastre para sua empresa.

Agora a pergunta é como evitar Race Condition em seu aplicativo Java?

  1. Se a condição de corrida estiver em atualizações para algumas estruturas de dados compartilhadas na memória, você precisará sincronizar o acesso e as atualizações da estrutura de dados de maneira apropriada.
  2. Se a condição de corrida estiver em atualizações no seu banco de dados, você precisará reestruturar seu SQL para usar transações no nível apropriado de granularidade.
  3. Não é uma má ideia fazer testes de carga antes de entrar em produção. Mais carga pode causar condição de corrida rara. Melhor corrigi-lo antes de corrigi-lo mais tarde.
  4. Certifique-se de não ter nenhuma variável global na qual você escreve.
  5. Em Java, cada objeto tem um e apenas um monitor e mutex associado a ele. O monitor único tem várias portas, no entanto, cada uma indicada pela palavra-chave synchronized . Quando um thread passa pela palavra-chave synchronized , ele efetivamente bloqueia todas as portas.
  6. É claro que, se um thread não passar pela palavra-chave synchronized , ele não trancou a porta e algum outro thread pode entrar livremente a qualquer momento.