Em termos simples,
static : as static
variáveis estão associadas à classe , e não a qualquer objeto . Cada instância da classe compartilha uma variável de classe, que está em um local fixo na memória
volátil : esta palavra-chave é aplicável a variáveis de classe e instância .
O uso de variáveis voláteis reduz o risco de erros de consistência da memória, porque qualquer gravação em uma variável volátil estabelece um relacionamento de antes do acontecimento com leituras subsequentes dessa mesma variável. Isso significa que alterações em uma variável volátil são sempre visíveis para outros threads
Dê uma olhada neste artigo por Javin Paul
entender variáveis voláteis em uma maneira melhor.
Na ausência de volatile
palavra-chave, o valor da variável na pilha de cada thread pode ser diferente. Fazendo a variável como volatile
, todos os threads obterão o mesmo valor em sua memória de trabalho e erros de consistência de memória foram evitados.
Aqui, o termo variable
pode ser static
variável (classe) ou variável instance
(objeto).
Em relação à sua consulta:
De qualquer forma, um valor de variável estática também será um valor para todos os encadeamentos; por que deveríamos optar pelo volátil?
Se eu precisar de instance
variável no meu aplicativo, não posso usar a static
variável. Mesmo no caso de static
variável, a consistência não é garantida devido ao cache do Thread, conforme mostrado no diagrama.
O uso de volatile
variáveis reduz o risco de erros de consistência da memória, porque qualquer gravação em uma variável volátil estabelece um relacionamento de antes do acontecimento com leituras subsequentes dessa mesma variável. Isso significa que as alterações em uma variável volátil são sempre visíveis para outros threads.
Além disso, também significa que, quando um encadeamento lê uma variável volátil, ele vê não apenas as alterações mais recentes no volátil, mas também os efeitos colaterais do código que levou à mudança => erros de consistência na memória ainda são possíveis com variáveis voláteis . Para evitar efeitos colaterais, você deve usar variáveis sincronizadas. Mas há uma solução melhor em java.
Usar o acesso simples a variáveis atômicas é mais eficiente do que acessar essas variáveis por meio de código sincronizado
Algumas das classes no java.util.concurrent
pacote fornecem métodos atômicos que não dependem da sincronização.
Consulte este artigo de controle de simultaneidade de alto nível para obter mais detalhes.
Dê uma olhada especialmente nas variáveis atômicas .
Perguntas relacionadas ao SE:
Volatile Vs Atomic
AtomicBoolean vs Volatile boolean
Diferença entre volátil e sincronizado em Java