O que você precisa saber para começar com o Java Virtual Machine

  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)). . . .

https://mp.weixin.qq.com/s?__biz=MzUzNTY1MzE3NA==&mid=2247484019&idx=1&sn=eeee2f3bca2ce7bcc7c156bc24dc553c&chksm=fa837c2acdf4f53cdf4a3c929914671837b495154a0dfb76cbc3da435faae112624c050acc32&token=1666815065&lang=zh_CN#rd

Mais atenção à conta pública do WeChat  

                                                            

Publicado 24 artigos originais · elogiou 36 · mais de 20.000 visualizações

Acho que você gosta

Origin blog.csdn.net/tanjunchen/article/details/99710694
Recomendado
Clasificación