Arquitetura de programação (05): simultaneidade multithreaded Java

Código-fonte deste artigo: GitHub · clique aqui || GitEE · clique aqui

Um, mapa multi-thread

Arquitetura de programação (05): simultaneidade multithreaded Java

2. Noções básicas de multithreading

1. Conceitos básicos

Um thread é a menor unidade que o sistema operacional pode executar o agendamento da operação, incluída no processo, e é a unidade operacional real no processo. Um thread se refere a um único fluxo de controle sequencial em um processo. Vários threads podem ser simultâneos em um processo, e cada thread executa tarefas diferentes em paralelo.

2. Método de criação

Herde a classe Thread, implemente a interface Runnable, com base nas interfaces Callable e Future, e Timer é um thread em segundo plano e um pool de threads.

3. Status da linha

Arquitetura de programação (05): simultaneidade multithreaded Java

Descrição do estado: estado inicial, estado de execução, estado de bloqueio, estado de espera, estado de espera de horas extras e estado de término.

4. Mecanismo de execução

Arquitetura de programação (05): simultaneidade multithreaded Java

Um aplicativo na JVM pode ser executado em paralelo por vários encadeamentos. Os encadeamentos são mapeados um a um para o encadeamento do sistema operacional onde o serviço está localizado, planejado para ser executado na CPU disponível e um encadeamento do sistema operacional é criado na inicialização; quando o encadeamento termina, isso Os threads do sistema operacional também serão reciclados.

5. Modelo de memória

Arquitetura de programação (05): simultaneidade multithreaded Java

Quando a máquina virtual é iniciada e executada, vários threads são criados. Alguns módulos na área de dados são compartilhados por threads e alguns são privados:

Compartilhamento de thread: área de metadados, heap;

Thread privado: pilha de máquina virtual, pilha de método local, contador de programa;

Uma única CPU pode executar apenas um thread em um momento específico, portanto, vários threads usam vários blocos de espaço e competem constantemente pelo período de execução da CPU.

Três, conceitos comuns

1. Prioridade do tópico

O agendador de encadeamentos tende a executar encadeamentos com alta prioridade de encadeamento. A alta prioridade de encadeamento indica que a probabilidade de adquirir recursos da CPU é alta ou os fragmentos de tempo de execução adquiridos são altos e a probabilidade de execução é alta, mas não significa que a baixa prioridade deve ser executada por último.

2. Tópico do Daemon

O encadeamento daemon suporta encadeamentos auxiliares, que desempenham principalmente uma função de agendamento e suporte no programa.Quando todos os encadeamentos não-daemon no Jvm terminarem, o encadeamento daemon também será encerrado.

3. Thread join

No encadeamento A, execute o método de junção do encadeamento B, então o encadeamento A esperará que o encadeamento B termine a execução antes de retornar para continuar a execução.

4. Tópico local

ThreadLocal também é chamada de variável local do thread. Ela cria uma cópia da variável em cada thread. Cada thread pode acessar sua própria variável de cópia interna, e os threads não afetam uns aos outros.

Quarto, thread safety

Do ponto de vista de como as threads e o espaço de memória são ocupados na figura acima, é necessário garantir a segurança das threads quando as threads acessam o bloco de memória compartilhada.

1. Controle síncrono

Sincronizado controle de sincronização de palavras-chave, pode modificar métodos, modificar blocos de código, modificar métodos estáticos, etc., recursos de controle de sincronização são poucos, pode melhorar a eficiência de multithreading.

2. Mecanismo de bloqueio

Interface de bloqueio: uma das interfaces raiz para bloqueio de recursos na programação simultânea Java, que especifica vários métodos básicos para bloqueio de recursos.

Classe ReentrantLock: Bloqueio reentrante que implementa a interface Lock, ou seja, se um thread adquire o bloqueio da instância atual e entra no método de tarefa, pode entrar no método de tarefa novamente sem liberar o bloqueio. Características: exclusão mútua, a saber Apenas um thread entra na tarefa por vez.

Interface de condição: descreve as variáveis ​​de condição que podem ser associadas ao bloqueio e fornece funções mais poderosas.Por exemplo, Conditon pode implementar várias notificações e notificações seletivas no mecanismo de espera / notificação de thread.

3. Palavras-chave voláteis

Volatile modifica variáveis ​​de membro e não pode modificar o método, ou seja, quando o thread acessa esta variável, ela precisa ser obtida da memória compartilhada. As modificações na variável também precisam ser liberadas para a memória compartilhada de forma síncrona, garantindo a visibilidade da variável para todos os threads.

Cinco, discussão de comunicação

Um thread é uma entidade independente, mas no processo de execução do thread, se a mesma lógica de negócios for processada, pode ocorrer contenção de recursos, resultando em problemas de simultaneidade e até mesmo deadlock.A coordenação entre os threads requer um mecanismo de comunicação para garantir.

1. Método básico

O método relacionado é o método básico do nível de Objeto em Java, e qualquer objeto tem este método: notificar () informa aleatoriamente um encadeamento esperando que o objeto termine o estado de espera e retorne; o encadeamento wait () entra no estado de espera, ele não Competindo pelo objeto de bloqueio, você também pode definir o tempo de espera;

2. Mecanismo de espera / notificação

Mecanismo de espera / notificação. Neste modo, o thread A chama o método wait () do objeto para entrar no estado de espera quando a execução da tarefa não for satisfeita. O thread B modifica a condição de execução do thread A e chama o método notificar () ou notificarAll () do objeto , O Thread A retorna do estado de espera após receber a notificação e, em seguida, executa as operações subsequentes. Os dois threads completam a interação entre espera e notificação por meio de wait () / notificação () / notificaçãoAll () fornecida pelo objeto, o que melhora a escalabilidade do programa.

3. Comunicação do fluxo do pipeline

O fluxo do pipeline é usado principalmente para transferir dados diretamente entre diferentes threads. Um thread envia dados para o canal de saída e o outro thread lê os dados do canal de entrada, realizando assim a comunicação entre diferentes threads.

Seis, pool de threads

1. Interface do Executor

No sistema Executor, o envio de tarefa de thread e a execução de tarefa são projetados para serem separados. O Executor tem várias classes de implementação poderosas que fornecem maneiras convenientes de enviar tarefas e obter resultados de execução de tarefas, encapsulando o processo de execução de tarefas, e não precisam mais dele O método Thread (). Start () cria threads explicitamente e executa tarefas associadas a elas.

2. Parâmetros principais

Arquitetura de programação (05): simultaneidade multithreaded Java

3. Classes de API relacionadas

Arquitetura de programação (05): simultaneidade multithreaded Java

Tarefa do pool de threads: interface principal: Runnable, Callable interface e classe de implementação de interface;

O resultado da tarefa: interface Future e classe de implementação FutureTask;

Execução da tarefa: interface central Executor e interface ExecutorService. Na estrutura do Executor, existem duas classes principais que implementam a interface ExecutorService, ThreadPoolExecutor e ScheduledThreadPoolExecutor.

Sete, API de thread comum

1. Mecanismo de bifurcação / união

A estrutura Fork / Join é usada para executar tarefas em paralelo. A ideia central é dividir uma tarefa grande em várias tarefas pequenas e, em seguida, resumir os resultados da execução de cada tarefa pequena para obter o resultado final da tarefa grande. Processo central: tarefas divididas, execução assíncrona de tarefas de módulo e mesclagem de resultados de tarefa única.

2. Container

ConcurrentHashMap: Use o mecanismo de bloqueio de segmento para dividir os dados no contêiner em segmentos e armazená-los em segmentos e, em seguida, atribuir um bloqueio a cada segmento de dados. Quando um encadeamento ocupa o bloqueio para acessar um segmento de dados, os dados em outros segmentos também podem ser usados ​​por outros segmentos. Acesso à thread, considerando segurança e eficiência de execução.

ConcurrentLinkedQueue: *** fila thread-safe com base em nós de link, classifica os elementos de acordo com o princípio FIFO, a cabeça da fila é o elemento com o tempo mais longo na fila e a cauda da fila é o elemento com o tempo mais curto na fila, novo O elemento é adicionado ao final da fila e a operação get element é obtida do início da fila.

3. Atômico

O JDK vem com classes de operação atômica, que tratam da operação simultânea de uma variável por vários threads, incluindo: tipos básicos, tipos de array, tipos de referência e tipos de modificação de atributo.

Oito, cenários de aplicação

1. Tarefas cronometradas

Por meio das definições de configuração, alguns programas são executados regularmente em um determinado ponto de tempo ou tempo de ciclo.A execução de tarefas aqui é baseada na tecnologia multithreading.

2. Processamento assíncrono

O processamento assíncrono significa que o programa não é executado de acordo com o bloco de código síncrono atual. O processamento assíncrono e o processamento síncrono são opostos. A realização do assíncrono também requer vários threads ou vários processos para melhorar a eficiência do programa.

3. Decomposição de tarefas

Operações comuns em bancos de dados distribuídos. Os dados são distribuídos em cópias de bancos de dados diferentes. Ao realizar uma consulta, cada serviço deve executar uma tarefa de consulta e, finalmente, mesclar os dados em um serviço ou fornecer uma camada intermediária de mecanismo para agregação Dados, em tarefas de temporização de grande escala, as tarefas a serem processadas são frequentemente fragmentadas de acordo com uma estratégia específica e vários threads são processados ​​ao mesmo tempo.

4. Tecnologia de pool de conexão

A tecnologia de criação e gerenciamento de um buffer pool de conexões, essas conexões estão prontas para serem utilizadas por qualquer encadeamento que precise delas, reduzindo o problema de criação e liberação contínua de conexões e melhorando a eficiência do programa.

Nove, endereço do código-fonte

GitHub·地址
https://github.com/cicadasmile
GitEE·地址
https://gitee.com/cicadasmile

Leitura recomendada: sistema de programação de acabamento

Número de série Nome do Projeto Endereço GitHub Endereço GitEE Recomendado
01 Java descreve padrões de design, algoritmos e estruturas de dados GitHub · clique aqui GitEE · Clique aqui ☆☆☆☆☆
02 Fundação Java, simultaneidade, orientado a objetos, desenvolvimento web GitHub · clique aqui GitEE · Clique aqui ☆☆☆☆
03 Explicação detalhada do caso do componente básico do microsserviço SpringCloud GitHub · clique aqui GitEE · Clique aqui ☆☆☆
04 Caso abrangente de arquitetura de microsserviço SpringCloud GitHub · clique aqui GitEE · Clique aqui ☆☆☆☆☆
05 Introdução ao aplicativo básico do framework SpringBoot para avançado GitHub · clique aqui GitEE · Clique aqui ☆☆☆☆
06 O framework SpringBoot integra e desenvolve middleware comum GitHub · clique aqui GitEE · Clique aqui ☆☆☆☆☆
07 Caso básico de gerenciamento de dados, distribuição, design de arquitetura GitHub · clique aqui GitEE · Clique aqui ☆☆☆☆☆
08 Série de Big Data, armazenamento, componentes, computação e outras estruturas GitHub · clique aqui GitEE · Clique aqui ☆☆☆☆☆   

Acho que você gosta

Origin blog.51cto.com/14439672/2539837
Recomendado
Clasificación