Às vezes, a otimização de compiladores e processadores faz com que o tempo de execução seja diferente do que imaginamos. Por esse motivo, o Java impôs algumas restrições aos compiladores e processadores. O Java Memory Model (JMM) abstra -nos para que não haja necessidade de considerar tantos detalhes subjacentes ao escrever código e garante que "desde que você siga as regras do JMM para escrever um programa, o resultado em execução deve estar correto".
Estrutura abstrata de JMM
Em Java, todas as instâncias e variáveis estáticas são armazenadas na memória da heap, que podem ser compartilhadas entre os threads, e essa parte também é chamada de variáveis compartilhadas . Variáveis locais, parâmetros de definição do método e parâmetros de manuseio de exceção estão na pilha, e a memória da pilha não é compartilhada entre os threads.
No entanto, devido à otimização do compilador e do processador, haverá problemas de visibilidade com variáveis compartilhadas. Por exemplo, em vários processadores, os threads podem ser executados em diferentes processadores, e o cache inconsistente entre os processadores causará problemas de visibilidade com variáveis compartilhadas . É possível que dois threads vejam diferentes valores da mesma variável.
O JMM abstrai as otimizações feitas por esses hardware, pois cada thread possui uma memória local. Quando você precisar ler e escrever variáveis compartilhadas, copie uma cópia da memória principal para a memória local. Ao escrever variáveis compartilhadas, escreva -as na memória local primeiro e depois as atualize na memória principal em algum momento no futuro. Quando a variável compartilhada for lida novamente, ela será lida apenas na memória local.
Dessa forma, a comunicação entre threads requer duas etapas:
Tópico de gravação: Atualize a memória local e leia o tópico: Leia o valor atualizado da memória principal
Dessa maneira, há um atraso entre escrever e ler: quando a memória local será atualizada na memória principal? Isso leva a problemas de visibilidade, e diferentes threads podem ver diferentes variáveis compartilhadas.
acontece antes
Literalmente acontece antes significa "antes de acontecer antes disso". Esta é a regra que o Java se formula na ordem da execução do programa, e a sincronização deve ser seguida. Dessa forma, os programadores só precisam escrever o programa síncrono correto e, portanto, garantir que os resultados em execução não estejam errados.
A aconteça antes de B não apenas significa que A é executado antes de B, mas também significa que o resultado da execução de A é visível para B, o que garante a visibilidade.
A acontece antes de B, A não precisa ser executado antes B. Se AB alternar e os resultados da execução ainda estiverem corretos, o compilador e o processador poderão otimizar a reordenação. Portanto, desde que os resultados do programa estejam corretos, não há problema em como o compilador e o processador otimizam e reordenam, e tudo é bom.
acontece antes das regras
Regras de sequência do programa: Em um tópico, as regras de bloqueio da operação após a operação anterior acontecem antes: para o mesmo bloqueio, o desbloqueio acontece antes e bloqueia as regras voláteis do domínio: escreva a variável volátil e leia qualquer uma das variáveis voláteis depois de ocorrer antes. Transitividade da operação: a acontece antes de B, B acontece antes de C, então a faz antes C Start () Regras: Se o thread a executar threadb.start () então threadb.start () ocorrer antes de qualquer operação de junção () Breeffore B: ThreadB. Thread. ThreadB.Join () Segure todas as operações ().
O exemplo a seguir ajuda a entender que acontece antes
Pi duplo = 3,14; // adado r = 1,0; // área de Bdouble = pi * r * r; // c
Aqui estão três relacionamentos que acontecem antes, as regras 1 e 2 são regras de ordem do programa e as regras 3 são derivadas de regras transitivas:
Aco
C depende de A e B, mas nem A nem B dependem disso. Portanto, mesmo que A e B sejam reordenados, os resultados da execução não serão alterados. Nesta reordenação, o JMM está em execução.
As duas seqüências de execução a seguir estão corretas.
O exposto acima é todo o conteúdo que compilamos para você sobre o aprendizado do modelo Java Memory JMM. Para mais perguntas, deixe uma mensagem abaixo para discutir. Obrigado pelo seu apoio ao wulin.com.