O princípio subjacente do java volátil

1. Introdução

  1. Variáveis ​​modificadas por voláteis na linguagem Java podem garantir visibilidade em cenários de encadeamento,
  2. 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.

  1. Os dados da linha de cache do processador atual serão gravados de volta na memória do sistema.
  2. 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

  1. 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
  2. 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

Publicado 17 artigos originais · ganhou 24 · visualizações 280,000 +

Acho que você gosta

Origin blog.csdn.net/qq_22956867/article/details/79400428
Recomendado
Clasificación