01 | Visibilidade, atomicidade e ordenação: a fonte de erros de programação simultâneos
A história por trás do programa concorrente
Uma das fontes: Problemas de visibilidade causados pelo armazenamento em cache
A segunda fonte: o problema atômico causado pela troca de threads
A terceira fonte: o problema de pedidos trazido pela otimização da compilação
Sumário
02 | Modelo de memória Java: Veja como o Java resolve os problemas de visibilidade e ordem
Qual é o modelo de memória Java?
Confusão sobre o uso volátil
Regra acontece antes de
O resultado da operação anterior é visível para operações subsequentes
-
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. -
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. -
Transitividade
Essa regra significa que, se A Acontece Antes de B e B Acontece Antes de C, A Acontece Antes de C. -
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. -
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. -
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
- Destruir as condições de ocupação e espera
- Destruição de condições não preemptivas
- 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.
Sumário
08 | Governança: a chave mestra para programação simultânea
O que é controle
Modelo MESA
A postura correta de wait ()
notify () quando pode ser usado
Sumário
09 | Java Thread (Parte 1): Ciclo de Vida do Java Thread
Ciclo de vida da rosca comum
Ciclo de vida do encadeamento em Java
-
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 -
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. -
Transição de estado RUNNABLE e TIMED_WAITING
-
Do estado NEW ao RUNNABLE, chame o método start () do objeto de encadeamento
-
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
13 | Respostas para questões importantes dos módulos de fundamentação teórica
E essa "história em série"?