A primeira parte do registro de aprendizado do combate de programação simultânea em Java

Insira a descrição da imagem aqui

01 | Visibilidade, atomicidade e ordenação: a fonte de erros de programação simultâneos

A história por trás do programa concorrente

Insira a descrição da imagem aqui

Uma das fontes: Problemas de visibilidade causados ​​pelo armazenamento em cache

A segunda fonte: o problema atômico causado pela troca de threads

Insira a descrição da imagem aqui

A terceira fonte: o problema de pedidos trazido pela otimização da compilação

Insira a descrição da imagem aqui

Sumário

Insira a descrição da imagem aqui

02 | Modelo de memória Java: Veja como o Java resolve os problemas de visibilidade e ordem

Qual é o modelo de memória Java?

Insira a descrição da imagem aqui

Confusão sobre o uso volátil

Regra acontece antes de

O resultado da operação anterior é visível para operações subsequentes

  1. A regra de sequência do programa
    Esta regra refere-se à operação anterior Acontece Antes em qualquer thread, de acordo com a sequência do programa em um thread.

  2. Regra de variável volátil
    Esta regra refere-se à operação de gravação de uma variável volátil, acontece antes na operação de leitura subsequente dessa variável volátil.

  3. Transitividade
    Essa regra significa que, se A Acontece Antes de B e B Acontece Antes de C, A Acontece Antes de C.

  4. A regra de bloqueio no processo de tubulação
    Esta regra refere-se ao desbloqueio de um bloqueio Acontece Antes e ao bloqueio subsequente desse bloqueio.

  5. Regra de início do segmento ()
    Trata-se do início do segmento. Isso significa que, após o encadeamento principal A iniciar o encadeamento filho B, o encadeamento filho B pode ver a operação do encadeamento principal antes de iniciar o encadeamento filho B.

  6. Regra de junção de thread ()
    Trata-se de espera de thread. Isso significa que o thread principal A aguarda a conclusão do sub-thread B (o thread principal A é realizado chamando o método join () do sub-thread B. Quando o sub-thread B é concluído (o thread principal A retorna no método join ()), o thread principal pode ver Para o segmento filho. Obviamente, o chamado "ver" refere-se à operação de variáveis ​​compartilhadas.

Sumário

Na linguagem Java,A semântica do Happens-Before é essencialmente um tipo de visibilidade, A acontece antes de B significa que o evento A é visível para o evento B, independentemente de o evento A e o evento B ocorrerem no mesmo encadeamento. Por exemplo, o evento A ocorre no segmento 1 e o evento B ocorre no segmento 2. A regra Happens-Before garante que o segmento 2 também possa ver a ocorrência do evento A.

03 | Bloqueio de exclusão mútua (parte 1): resolvendo problemas atômicos

Como resolver o problema atômico?

Você já sabe que a fonte do problema de atomicidade é
que a condição de troca de encadeamento "apenas um encadeamento é executado ao mesmo tempo" é muito importante, que chamamos de exclusão mútua.

Modelo de bloqueio simples

Modelo de bloqueio aprimorado

Tecnologia de bloqueio fornecida pela linguagem Java: sincronizada

04 | Bloqueio de exclusão mútua (parte 2): como proteger vários recursos com um bloqueio?

Proteger vários recursos que não estão relacionados

Proteger vários recursos relacionados

Sumário

Qual é a essência da "atomicidade"? De fato, não é indivisível, indivisível é apenas uma manifestação externa, sua essência é a exigência de consistência entre múltiplos recursos,O estado intermediário da operação não é visível para o mundo externo.

05 | O que fazer se eu entrar em conflito acidentalmente?

Como evitar deadlock

Insira a descrição da imagem aqui

  1. Destruir as condições de ocupação e espera
  2. Destruição de condições não preemptivas
  3. Quebrar a condição de espera do loop

06 | Espera circular otimizada com mecanismo "espera-notificação"

Implementando mecanismo de espera-notificação com sincronização

07 | Problemas de segurança, atividade e desempenho

Todo o código precisa ser cuidadosamente analisado se esses três problemas existem? Claro que não. De fato, é necessária apenas uma situação: há dados compartilhados e os dados serão alterados.De um modo geral, vários encadeamentos lerão e gravarão os mesmos dados ao mesmo tempo.

Programação concorrentePrecisamos prestar atenção a muitos problemas.Felizmente, nossos antecessores nos ajudaram a resumi-los.Existem três aspectos principais, a saber: problemas de segurança, problemas ativos e problemas de desempenho.

Questões de segurança

Quando vários threads acessam os mesmos dados ao mesmo tempo e pelo menos um thread grava esses dados, se não tomarmos medidas de proteção, isso causará bugs simultâneos.Há também um termo profissional para isso, chamado data race (Data Race) )

Condição de corrida refere-se à ordem em que o resultado da execução do programa depende da execução do encadeamento.

Diante da concorrência de dados e das condições de corrida , como podemos garantir a segurança do encadeamento? De fato, esses dois tipos de problemas podem usar a solução da tecnologia de exclusão mútua, e existem muitas soluções para obter a exclusão mútua.A CPU fornece instruções relacionadas mutuamente exclusivas e o sistema operacional e a linguagem de programação também fornecem APIs relacionadas. Do ponto de vista lógico, podemos ser unificados em: lock .

Problema ativo

O chamado problema de vivacidade refere-se ao fato de que uma operação não pode ser executada. Nosso "impasse" comum é um problema ativo típico; é claro, além do impasse , existem dois casos: " livelock " e "fome" .

Às vezes, embora o encadeamento não esteja bloqueado, ainda haverá situações em que ele não pode ser executado, chamado "bloqueio ao vivo".
A chamada "fome" refere-se à situação que o encadeamento não pode executar porque não pode acessar os recursos necessários.

Problemas de desempenho

O motivo pelo qual existem tantas coisas no pacote simultâneo do Java SDK é que grande parte do motivo é melhorar o desempenho em um campo específico.
Insira a descrição da imagem aqui

Sumário

Sumário

08 | Governança: a chave mestra para programação simultânea

O que é controle

Insira a descrição da imagem aqui

Modelo MESA

Insira a descrição da imagem aqui
Insira a descrição da imagem aqui

A postura correta de wait ()

notify () quando pode ser usado

Sumário

Insira a descrição da imagem aqui

09 | Java Thread (Parte 1): Ciclo de Vida do Java Thread

Ciclo de vida da rosca comum

Insira a descrição da imagem aqui

Ciclo de vida do encadeamento em Java

Insira a descrição da imagem aqui

  1. Transição de estado RUNNABLE e BLOCKED
    Há apenas um cenário que acionará essa transição, ou seja, o encadeamento aguarda um bloqueio implícito sincronizado

  2. A transição de estado de RUNNABLE e WAITING O
    primeiro cenário é obter um thread de bloqueio implícito sincronizado e chamar o método Object.wait () sem parâmetros.O
    segundo cenário é chamar o método Thread.join () sem parâmetros.
    No terceiro cenário, chame o método LockSupport.park (). Chame o método LockSupport.park (), o thread atual será bloqueado e o estado do thread será alterado de RUNNABLE para WAITING. Chame LockSupport.unpark (thread thread) para ativar o thread de destino e o estado do thread de destino será alterado de WAITING state para RUNNABLE.

  3. Transição de estado RUNNABLE e TIMED_WAITING
    Insira a descrição da imagem aqui

  4. Do estado NEW ao RUNNABLE, chame o método start () do objeto de encadeamento

  5. Do estado RUNNABLE ao TERMINATED

Qual é a principal diferença entre os métodos stop () e interrupt ()?

10 | Java threads (meio): quantos threads são apropriados para criar?

Por que usar multithreading?

Existem muitos indicadores para medir o desempenho, mas existem dois indicadores principais: latência e taxa de transferência .

Cenários de aplicativos multithread

Quantos threads são apropriados para criar?

Cenários de computação intensivos em CPU, em teoria, "o número de threads = o número de núcleos da CPU" é o mais apropriado. No entanto, na engenharia, o número de threads geralmente é definido como "núcleos da CPU + 1"

Para cenários de computação intensivos em E / S, o número ideal de threads = número de núcleos da CPU * [1 + (E / S demorado / CPU demorado)]

De fato, desde que você compreenda um princípio, esse princípio é maximizar o desempenho do hardware.

11 | Java Threads (Parte 2): Por que as variáveis ​​locais são seguras contra thread?

Como o método é executado

Onde as variáveis ​​locais são armazenadas?

Pilha de chamadas e thread

Fecho de rosca

12 | Como escrever programas concorrentes com o pensamento orientado a objetos?

Primeiro, encapsule variáveis ​​compartilhadas

Para essas variáveis ​​compartilhadas que não serão alteradas, é recomendável usar a palavra-chave final para modificar

Segundo, identifique as restrições entre variáveis ​​compartilhadas

3. Desenvolver estratégias de acesso simultâneo

Insira a descrição da imagem aqui

13 | Respostas para questões importantes dos módulos de fundamentação teórica

E essa "história em série"?

Insira a descrição da imagem aqui
Insira a descrição da imagem aqui

1. Práticas recomendadas para usar bloqueios

2. O desempenho da trava depende da cena

3. A condição de corrida precisa de atenção extra

4. A chamada do método é calcular os parâmetros primeiro

5. O tratamento de exceção InterruptedException precisa ter cuidado

6. Valor teórico ou valor empírico

Publicado 138 artigos originais · elogiado 3 · visitas 7212

Acho que você gosta

Origin blog.csdn.net/weixin_43719015/article/details/105665924
Recomendado
Clasificación