Coisas a considerar ao escrever código thread-safe:
1. Variáveis compartilhadas
2. Variáveis mutáveis
Compartilhado significa que vários threads podem acessá-lo ao mesmo tempo, e mutável significa que seu valor pode mudar durante seu ciclo de vida.
Por exemplo, a seguinte variável de contagem:
Copie o código do código da seguinte forma:
//Classe insegura para thread
classe pública UnsafeCount {
private int count = 0; //Esta variável é compartilhada
public void boost() { //Não há mecanismo de sincronização aqui, vários threads podem acessar ao mesmo tempo
contagem++; //Esta variável é variável
}
public int getContagem() {
contagem de retorno;
}
}
Existem 4 maneiras de corrigir esse problema:
1. Em vez de compartilhar a variável de estado entre threads, você pode encapsular a variável em um método (objetos sem estado devem ser thread-safe porque as variáveis no método são exclusivas para cada thread e não são compartilhadas com outros threads); por exemplo:
Copie o código do código da seguinte forma:
public int add(int contagem){
return ++count;//Também pode ser dito aqui que objetos sem estado devem ser thread-safe
}
2. Modifique a variável de estado para uma variável imutável.
Copie o código do código da seguinte forma:
contagem int final privada = 0;
3. Use estratégia de sincronização ao acessar variáveis de estado.
Copie o código do código da seguinte forma:
aumento de void sincronizado público() {
contar++;
}
4. Use classes de variáveis atômicas.
Copie o código do código da seguinte forma:
contagem privada de AtomicInteger;
aumento de vazio público() {
contagem.getAndAdd(1);
}