1. Introdução
- Variáveis modificadas por voláteis na linguagem Java podem garantir visibilidade em cenários de encadeamento,
- Impedir a instrução do processador reordenação rearranjo instrução em um ambiente multithread, não haverá problemas de visibilidade
Ou seja, existe o encadeamento AB, que pode acessar a variável volátil x.
Quando o encadeamento A modifica x, o encadeamento B pode acessar a variável x novamente para obter o valor mais recente de x.
Variáveis não voláteis não podem garantir isso.
Princípio da visibilidade
Se o modificador de variável volátil for usado corretamente, será mais barato usar e executar que sincronizar, porque não causará alternância e programação de contexto de encadeamento.
Quando uma variável compartilhada decorada com uma variável volátil é gravada, é usado o código de montagem de bloqueio.A instrução com o prefixo de bloqueio causará duas coisas em um processador com vários núcleos.
- Os dados da linha de cache do processador atual serão gravados de volta na memória do sistema.
- Esta operação de gravação na memória fará com que os dados armazenados em cache no endereço de memória em outras CPUs sejam inválidos. (Outras CPUs invalidam o cache através da detecção de cache)
Princípio da prevenção do rearranjo
- Insira a barreira StoreStore antes de cada operação de gravação volátil e a barreira StoreLoad após a operação de gravação
- Insira uma barreira LoadLoad antes de cada operação de leitura volátil e uma barreira LoadStore após uma operação de leitura;
barreira de memória java
- A barreira da memória do Java é geralmente chamada de quatro tipos, a saber LoadLoad, StoreStore, LoadStore, StoreLoad, na verdade, é uma combinação das duas acima, completa uma série de barreiras e funções de sincronização de dados.
- Barreira LoadLoad: Para essas instruções Load1; LoadLoad; Load2, antes que os dados a serem lidos pelo Load2 e as operações de leitura subsequentes sejam acessadas, verifique se os dados a serem lidos pelo Load1 são lidos.
- Barreira StoreStore: Para essas instruções Store1; StoreStore; Store2, antes que Store2 e operações de gravação subseqüentes sejam executadas, verifique se as operações de gravação Store1 estão visíveis para outros processadores.
- Barreira do LoadStore: Para essas instruções, Load1; LoadStore; Store2, antes que o Store2 e as operações de gravação subseqüentes sejam descarregadas, verifique se os dados a serem lidos pelo Load1 são lidos.
- Barreira StoreLoad: Para essas instruções Store1; StoreLoad; Load2, antes que o Load2 e todas as operações de leitura subsequentes sejam executadas, verifique se as gravações do Store1 estão visíveis para todos os processadores. Sua sobrecarga é a maior das quatro barreiras. Na maioria das implementações de processador, essa barreira é onipotente, combinando as funções das outras três barreiras de memória
Citação
https://www.jianshu.com/p/2ab5e3d7e510
https://www.cnblogs.com/chenssy/p/6379280.html