Como diz o ditado, os trabalhadores devem primeiro aprimorar suas ferramentas se quiserem fazer a coisa certa.Para os desenvolvedores Java, um simples entendimento de certos recursos da Java Virtual Machine é benéfico para melhorar o poder interno dos desenvolvedores. Por que precisamos instalar e configurar o JDK antes de escrever o código Java? Por que esses pacotes incorporados ao JDK são tão poderosos? Por que há um vazamento de memória em nosso programa? Por que o problema de inconsistência de dados não aparece quando o programa de acesso multiencadeado é adicionado com a palavra-chave Sincronizada no código? Muitas perguntas semelhantes serão respondidas depois que entendermos a JVM.
"Conhecimento profundo da Java Virtual Machine", de Zhou Zhiming Este livro é geralmente recomendado por todos.
Componentes principais:
classe pública hapBeforeDemo { private int value = 0; public int getValue () { valor de retorno; } public void setValue (valor int) { this.value = value; } public static void main (String [] args) { appearBeforeDemo novo Thread (() -> hapBeforeDemo.setValue (22)). start (); novo Thread (() -> Sistema. out .println (hapBeforeDemo.getValue ())). start (); } }
Todo mundo adivinha qual é o resultado? 0 ou 1? E que princípio esse código segue?
Qual é o princípio da concorrência simultânea?
Regras de sequência do programa Gerenciar regras de bloqueio regras de variáveis voláteis Regras de início de linha Regras de finalização de linha Regras de interrupção de linha Regras de finalização de objeto Transitividade
O problema de medir a segurança da linha não deve ser perturbado pela sequência do tempo, mas tudo é baseado no princípio da pré-ocorrência
Como o primeiro thread e o segundo thread chamam as funções setValue () e getValue () respectivamente, eles não estão no mesmo segmento e as regras de ordem do programa não se aplicam.Como não há bloco de sincronização, as operações de bloqueio e desbloqueio não ocorrerão naturalmente. A trava do tubo não é adequada. Como o valor não é modificado com volátil, naturalmente não há regra de variável volátil.As seguintes regras de inicialização, término de thread, interrupção de thread e terminação de objeto a seguir também são irrelevantes aqui. A última transitividade não se aplica. Portanto, esta operação é uma operação insegura de thread.
Soluções são mais comuns
/ ** * O segmento A acessa getValue O segmento B acessa setValue * Solução sincronizada volátil * /
Sabemos que esse código será eventualmente compilado em um arquivo .class.Antes de analisar o bytecode, primeiro entenda o seguinte conhecimento simples.
Descrição do formato do bytecode:
1: Versão dos arquivos Magic e Class 2: Pool constante 3: Sinalizador de acesso 4: Índice pai da classe e coleção de índice de interface 5: Coleção de tabela de campos 6: Coleção de tabelas de métodos 7: Coleção de tabelas de propriedades (1code 2Exceptions 3 Propriedade LineNumberTable 4 LocalVariableTable 5 SourceFile 6 Atributo ConstantValue 7 InnerClasses 8 Atributos reprovados e sintéticos 9 Atributo StackMapTable (adicionado após JDK1.6) 10 Atributo de assinatura (adicionado após JDK1.5) 11 Atributo BootstrapMethods (adicionado após JDK1.7)). . . .
Mais atenção à conta pública do WeChat