"Java Art programação concorrente" notas de estudo (b)

Capítulo 2 Java Concurrency mecanismos de princípio implementação subjacente

        Depois do código é compilado em código de bites Java, classes de bytecode carregado para a execução do código de bites JVM, JVM, é convertido com as instruções do montador finais que são executados no processador central, a simultaneidade em Java usada depende da JVM instruções de execução e CPU .

2.1 aplicações voláteis

        Em simultâneo programação sincronizada e volátil têm um papel importante, leve volátil sincronizado, para garantir a visibilidade de variáveis ​​compartilhadas.

  Visibilidade significa que quando um thread modifica uma variável compartilhada, outro segmento pode ler o valor dessa modificação.

  Se modificador variável volátil corretamente, será menor do que o custo de execução e sincronizado, porque volátil e não causa o agendamento de uma mudança de contexto fio.

    1, a definição e implementação dos princípios da volátil

        Na especificação da linguagem Java para a definição de volátil do seguinte: linguagem de programação Java permite tópicos para acessar compartilhada variáveis, variáveis podem ser compartilhados, a fim de garantir atualizações precisas e consistentes, segmento deve garantir para garantir que o acesso a esta variável só através de um bloqueio exclusivo. Java fornece volátil, e em alguns casos mais conveniente do bloqueio.

        E implementação volátil termos de CPU dependentes: barreira de memória (barreiras de memória), buffer de linha (linha de cache), a operação atômica (operações atômicas), o preenchimento linha de buffer (cache linha de preenchimento), um acerto de cache (cache hit), o hit de escrita (write hit ), write miss (write perde o cache)

        Como volátil para assegurar a visibilidade ? Modificadas variáveis compartilhadas voláteis será mais adicionado operação de escrita código de montagem bloqueio, a lei instrução trava duas coisas processadores multicore:

        1) A linha de tampão processador de dados de corrente é escrito de volta para a memória do sistema

        2) A memória write-back irá operar nos outros dados armazena em cache da CPU no endereço de memória não é válido

        Em multi-processador, a fim de garantir que cada coerência de cache do processador, ele irá armazenar em cache protocolo de coerência, cada processador para verificar a sua cache não está vencido por cheirar os dados que viajam através do bus, quando os achados processador próprio endereço de memória correspondente à linha de cache é modificado, o processador armazena o atual linha de cache definido para o estado inativo, quando o processador das operações de modificação de dados, o sistema de memória a partir dos dados lidos re-no cache do processador.

        realização volátil de dois princípios:

        1) Bloqueio prefixar instruções causa do cache do processador é escrito de volta à memória.

        2) de memória cache do processador é escrito de volta para causas outro cache do processador é inválida

    2, optimizar a utilização de volátil

        JDK novo contrato e um conjunto de filas de espera de 7 classe LinkedTransferQueue, que em uso variáveis ​​voláteis, bytes adicionais em uma forma de otimizar a fila para fora, para o desempenho da equipe. LinkedTransferQueue na classe interna PaddedAtomicRefernce só tinha uma coisa, falando variáveis ​​compartilhadas voláteis adicionados aos 64 bytes (uma referência de objecto ocupa quatro bytes, um adicional de 15 variáveis ​​é de 60 bytes, mais o valor da classe principal variável, um total de 64 bytes). Para os processadores de 64 bits, os adicional de 64 bytes de programação simultânea eficiência pode ser melhorada, porque o processador 64 não suporta o buffer de linha parcialmente preenchido, o que significa que, se o nó e cauda nó cabeça da fila é inferior a 64 bytes, eles processador vai ler um buffer de linha, cada processador irá colocar em cache a mesma cabeça, cauda sob nó mais processadores, um processador, quando o bloqueio modificar buffer de linha, o mecanismo de cache coerência com efeito, fará com que o processador pode aceder ao fim dos outros nós na sua própria memória cache, resultando numa baixa eficiência de enfileiramento fila Desenfileiramento. Depois de um byte adicional, evitando o nó principal do nó e da cauda em uma linha de tampão pode ser tal que o nó não bloquear-se mutuamente quando a cabeça e a cauda modificada.

     Quando a linha de cache não é um processador de largura de 64 bytes; variável frequentemente partilhada não é escrito (uma vez que a abordagem requer a utilização de processador byte adicional para ler mais bytes de memória tampão do cache, trará algumas desempenho consumo de; se a variável não é compartilhada com frequência de escrita, bloqueio possibilidade é muito pequena, mas também não há necessidade de evitar o bloqueio da outra por um modo de byte adicional), não há necessidade de adicionar a 64 bytes.

  No entanto, este modo de byte adicional pode não ter efeito na próxima Java7, porque Java7 irá eliminar campos inúteis ou reorganizar, necessidade de usar outro modo de byte adicional.

Princípios e Aplicações 2.2 execução sincronizada

        bloqueio pesado sincronizado, vários optimizado Java SE 1,6 Dui sincronizadas, não tão pesadas. Java SE 1.6, a fim de obter e fechaduras de libertação para reduzir o desempenho medidas problemas sobrecarga causada introduz tendem para bloqueio, bloqueio e outra optimização leve.

        sincronizado base para conseguir a sincronização: cada objecto em Java pode ser utilizada como um bloqueio. As formas específicas: método de sincronização normal, a fechadura é o exemplo actual do objecto; método de sincronização estático, o bloqueio é de classe objecto da classe de corrente; por sincronização de código de bloco, o bloqueio do objecto é sincronizado configuração suportes. Quando um thread tenta sincronizado método de acesso bloco / síncrona, você deve primeiro obter um bloqueio, o bloqueio deve ser liberado quando sair ou lançar uma exceção.

    sincronizada, em princípio, a implementação da JVM é: JVM sincronização com base entrar e métodos de implementação de objetos saída monitor ou blocos de código. Mas os dois não são os mesmos detalhes de implementação. Sincronização bloco é implementado usando as instruções monitorenter e monitorexit, enquanto outra forma de realizao método de sincronização. No entanto, o método de sincronização podem ser utilizados para atingir estes dois instruções.

    2.2.1 cabeçalho objeto Java

        O bloqueio é sincronizado com o avanço da presença de objectos em Java. Se o objecto é um tipo de matriz, a máquina virtual 3 lojas cabeçalho objecto toda a palavra, a não-utilização de 2-palavra largura tipo de matriz de cabeçalho objeto de armazenamento. 1 é igual a 4 bytes de largura.

    Java objeto cabeçalho: Mark Word (memória hashCode objeto, idade geracional, informações de bloqueio, etc.), classe de metadados Endereço (ponteiro para um tipo de objeto armazenado nos dados), matriz de comprimento (comprimento da matriz (se o objeto atual é um array))

    Comparação 2.2.2 atualização e bloqueio

        Em JavaSE1.6, status de bloqueio são: livre-lock status, tendem a situação de bloqueio, bloqueio de estado leve, status de bloqueio pesado . Esses estados vai aumentar a concorrência. Bloqueio pode ser atualizado, mas não pode voltar, o objetivo é melhorar a eficiência da obtenção e fechaduras de lançamento.

    Um fecho enviesada

       Na maioria dos casos, o bloqueio não é apenas a ausência de concorrência de multi-threaded, e sempre obter várias vezes pela mesma linha, um fio para adquirir um bloqueio de modo a permitir um custo menor, a introdução de bloqueio viés  . Quando um segmento para adquirir o bloqueio e o acesso a blocos de sincronização, vai ser bloqueado no cabeçalho do objecto e a gravação do quadro de pilha armazenado no interior inclinado de bloqueio ID de segmento do segmento depois de entrar e sair do bloco CAS sincronia não é necessário para operar de bloqueio e desbloqueio, única necessidade de testar a cabeça objeto Mark Palavra é armazenado na apontar thread para bloqueio viés. Se o teste for bem sucedido, indica que o segmento tem recebido bloqueio; se o teste não for bem sucedida, você precisa tendem a bloquear em teste bandeira Mark Word está definido para 1 (indicando o estado atual tem sido no bloqueio favor): Se não houver nenhum set, o bloqueio do CAS mecanismo de competição para contenção de bloqueio, se conjunto, a EAP irá tentar usar o tendenciosa bloqueio dos pontos de cabeça objeto para o segmento atual.

     (1) revogação de bloqueio inclinado

        O uso de um mecanismo de fecho enviesada até que liberta o bloqueio de competição há, portanto, quando as outras tentativas de rosca para bloquear competição inclinado, mantido inclinado segmento de bloqueio irá ser libertada.

        Tendenciosa revogação de bloqueio, é preciso esperar até que pontos de segurança globais (sem o código de byte está em execução neste momento no tempo). Ele primeiro tem de suspender tendenciosa fio de bloqueio, e em seguida, verificar se o segmento detém tendenciosa bloqueio vivo, se não estiver ativo, o objeto é primeiro conjunto de estado livre de bloqueio; se o segmento ainda está vivo, com um bloqueio tendenciosa da pilha será executado atravessar o bloqueio tendenciosa registro objeto, marca nominativa pilha de registros e bloquear o cabeçote seja re tendenciosa em favor de outros tópicos, ou nenhum bloqueio ou tag para restaurar o objeto não é adequado como tendenciosa bloqueando o último fio de despertador.

     (2) de fecho enviesada Fechar

    Java 6 e padrão Java7 é começar bloqueio parcial. só é activada poucos segundos após a aplicação é iniciada. JVM pode usar parâmetros XX: BiasedLockingStartupDelay = 0 definido para iniciar imediatamente, fechando atraso. Você pode usar -XX: -UsebiasedLocking-falsa tendenciosa cadeado fechado, então o programa para entrar no estado de bloqueio leve.

    2 bloqueio Lightweight

    (1) bloqueio bloqueio leve

        Passe antes de realizar bloco sincronizado, JVM será criado no espaço quadro de pilha do segmento atual para armazenar as fechaduras, e cabeçote de Mark Palavra copiados para bloquear o registro, oficialmente conhecido como "Mark Palavra Deslocadas". O fio então tentativas para substituir o cabeçalho objecto MarkWord ficha de bloqueio para apontar para os ponteiros do CAS. Se for bem sucedido, o segmento atual para adquirir o bloqueio, e se isso falhar, representa uma outra disputa do bloqueio thread, a thread atual tentará usar para obter o bloqueio de rotação.

    (2) bloqueio leve desbloqueado

        Leve quando desbloqueado, usará átomos artificiais CAS Deslocados Mark Palavra irá substituir a cabeça de volta para o objeto, se bem sucedido, isso significa que não há competição ocorre. Se ele falhar, não há concorrência representa o bloqueio atual, o bloqueio vai inchar bloqueio pesado.

        Porque o spin vai consumir CPU, a fim de evitar a rotação indesejados (como segmento para adquirir um bloqueio a ser bloqueado), uma vez bloqueio pesado para o escalonamento de bloqueios, não vai retornar ao estado de bloqueio leve. Quando o bloqueio está neste estado, outro segmento está tentando adquirir o bloqueio será bloqueada quando o segmento libera o bloqueio segurando o bloqueio vai acordar estes tópicos, a discussão será despertado uma nova rodada de bloqueio vitórias batalha.

    3, comparando as vantagens e desvantagens de bloqueio

 
 

O princípio de funcionamento de 2,3 atômica

    meios operação atômica que esta operação não é realizada subdivisão deve ser concluída de uma só vez executado, é interrompido para realizar outra operação não pode ser realizada após a parte.

    1, termos relacionados

    linha de cache (linha de cache), compare e troca (Compare e swap), gasoduto CPU (gasoduto CPU), memória conflito ordenação

    2, o processador é como conseguir operação atômica

        Para o processador, ou seja, ao mesmo tempo, a operação atômica apenas um processador processa os dados, ea operação atômica é indivisível. Há duas maneiras comuns: uma é para garantir a atomicidade por uma fechadura de ônibus, eo outro é garantida pelo bloqueio de cache atômica.

        chave Bus: o bloqueio de ônibus é usar um sinal de bloqueio # fornecido pelo processador, esta saída do processador quando um sinal no ônibus, solicitando outros processadores serão bloqueados para viver, para que o sinal pode ser emitido de memória do processador exclusivamente, para garantir operação atômica.

        bloqueio de cache: o bloqueio de cache é projetado para ônibus otimizar a fechadura. Porque o barramento durante o bloqueio está bloqueado, outros processadores não pode lidar com outros dados, só pode esperar que o bloqueio é libertada. Mas se o bloqueio sobre o cache pode reduzir esse impacto. Ele estava se referindo a área de memória no cache se o processador da linha de cache, e está bloqueado durante a operação de fechamento, em seguida, quando ele executa a operação de bloqueio é escrito de volta à memória, o processador não é sinal de bloqueio professam no ônibus, modificar diretamente o interno endereço de memória com o seu mecanismo de coerência de cache para garantir a operação atômica, porque os dados mecanismo de coerência de cache evita simultaneamente modificar a área de memória por dois ou mais cache do processador, escrever de volta para o cache do outro processador está bloqueado linhas de dados, fazer a linha de cache é inválido.

  Mas em ambos os casos o processador não utiliza o bloqueio de cache:

    1) O primeiro caso é a seguinte: quando os dados não podem ser operados dentro do cache do processador, ou operações em linha cache de dados múltiplos (linha de cache), o processador de chamadas de um bloqueio de barramento;

    2) A segunda situação é a seguinte: alguns processadores não suportam bloqueio cache. Mesmo se a área memória o bloqueio será chamado na linha de cache bloqueio barramento do processador.

  Para o acima de dois mecanismos podem ser implementados usando instruções de prefixo de bloqueio.

    3, Java como implementar operações atômicas

            Em Java usando um bloqueio e CAS circulando forma a garantir uma operação atômica

           (1)  CAS ciclo: a JVM para utilizar a operação CAS oficialmente instruções cmpxchg fornecidos pela implementação do processador. A idéia básica é para ser operado por ciclo CAS até bem sucedido.

            (2) de CAS operação do Três Atómica

                  1) problema ABA

          Solutions é um número de versão, o número da versão é adicionado na frente da variável, cada atualização variável quando o número da versão é incrementado. ABA para resolver o problema usando jdk1.5 AtomicStampedReference; ação compareAndSet desta classe é o método verifica a referência atual é igual ao de referência e verificações esperado se a bandeira atual é igual à bandeira esperado, se todos iguais atomicamente a bandeira ea referência valor para o determinado valor atualizado

        2) tempo de ciclo longo sobrecarga grande. Se o tempo não for bem sucedida CAS rotação, ele vai trazer um grande custo de execução da CPU.

          Se a JVM pode suportar instruções pausa fornecidos pelo processador, então haverá alguma melhoria da eficiência.

          comando de pausa tem dois efeitos: primeiro, ele pode atrasar a execução de pipeline de instruções (de-gasoduto), de modo que a CPU não consome muitos recursos para executar, o tempo de atraso da implementação depende, de algum atraso de tempo do processador é zero;

                    Em segundo lugar, ele pode evitar sair do loop quando a ordem devido a conflitos de memória (memória Order Violação) causadas por gasoduto CPU está desmarcada (CPU Pipeline nivelado), a fim de melhorar a eficiência da CPU.

        3) garantir que apenas uma operação atômica variável compartilhada

          As soluções podem ser partilhadas múltiplas variáveis ​​são combinadas em uma variável compartilhada para operar. Está prestes a colocar um objeto em múltiplas variáveis ​​para a operação CAS.

             (3) Bloqueio mecanismo: bloqueio mecanismo assegura que apenas a área de memória da rosca para a aquisição de uma fechadura para operar a fechadura, mas vários bloqueios em Java, em adição ao bloqueio parcial, JVM é uma maneira de conseguir anel de sincronização de CAS, isto é, quando um segmento quer entrar quando se utiliza um CAS cíclico adquire os blocos de sincronismo; ciclo CAS usado para libertar o bloqueio quando sair blocos de sincronização.

2.4 Resumo

Acho que você gosta

Origin www.cnblogs.com/mYunYu/p/12450324.html
Recomendado
Clasificación