26 Como otimizar a programação concorrente usando padrões de projeto?

Olá a todos, sou Xiaoshuozhu.

Quando usamos programação multithread, geralmente precisamos projetar um conjunto de funções de negócios de acordo com os cenários de negócios. De fato, na programação multithread, existem muitos padrões de design funcionais maduros, aprenda-os bem e use-os bem, o que é ainda mais poderoso. Hoje vou levar você a entender vários padrões de projeto comumente usados ​​em programação concorrente.

padrão de design de contexto de thread

Podemos também usar um caso específico para ver em quais cenários precisamos de contexto?

Ao executar uma tarefa de solicitação relativamente longa, a solicitação pode passar por muitas camadas de chamadas de método. Suponha que precisamos passar os resultados intermediários do primeiro método para o último método de cálculo. Os parâmetros desse resultado intermediário são adicionados à função, e eles são passados ​​em seqüência. código mostrar como abaixo:

WeChat picture_20220825212154.jpg WeChat picture_202208252121541.jpg

Resultados do:

WeChat picture_202208252121542.jpg

Além dos métodos acima, também podemos usar ThreadLocal para implementar context. ThreadLocal é uma variável local de thread, que pode realizar o isolamento de dados de vários threads. ThreadLocal fornece uma cópia independente para cada thread que usa a variável, os dados entre as threads são isolados e cada thread só pode acessar sua própria variável de cópia interna.

Existem três métodos comumente usados ​​em ThreadLocal: set, get e initialValue. Podemos observar o uso de ThreadLocal através do seguinte exemplo simples:

WeChat picture_202208252121543.jpg

Em seguida, usamos ThreadLocal para reimplementar o design de contexto original. Você descobrirá que não passamos o contexto por meio de variáveis ​​nos dois métodos, mas apenas obtemos as informações de contexto do thread atual por meio de ThreadLocal:

WeChat picture_202208252121544.jpg WeChat picture_202208252121545.jpg WeChat picture_202208252121546.jpg WeChat picture_202208252121547.jpg resultado da operação:

WeChat picture_202208252121548.jpg

Padrão de design de thread por mensagem

A tradução do padrão de design Thread-Per-Message significa um thread por mensagem. Por exemplo, quando estamos lidando com comunicação Socket, geralmente uma thread trata do monitoramento de eventos e leitura e escrita de E/S.Se as operações de leitura e escrita de E/S forem muito demoradas, este tempo afetará o monitoramento e processamento de eventos.

Neste momento, o modo Thread-Per-Message pode resolver bem este problema. Um thread escuta eventos de E/S, e sempre que um evento de E/S é monitorado, ele é entregue a outro thread de processamento para realizar operações de E/S . Abaixo, ainda usamos um exemplo para aprender a implementação desse padrão de projeto.

WeChat picture_202208252121549.jpg WeChat picture_2022082521215410.jpg WeChat picture_2022082521215411.jpg WeChat picture_2022082521215412.jpg

Padrão de design de thread de trabalho

O Worker aqui significa trabalhador, o que significa que no padrão de projeto Worker Thread, haverá alguns trabalhadores (threads) que processam continuamente o trabalho por sua vez. Quando não há trabalho, o trabalhador estará em estado de espera até que um novo trabalho chegue dentro. Além da função de trabalhador, o padrão de design Worker Thread também inclui pipelines e produtos.

Suponha que haja 8 robôs na linha de montagem de triagem de logística de um armazém de logística. Eles continuamente pegam pacotes da linha de montagem, os embalam e os enviam para o carro. Quando as mercadorias no armazém são embaladas, elas serão colocadas na linha de classificação logística em vez de entregues diretamente ao robô, e o robô classificará aleatoriamente os pacotes da linha de montagem. código mostrar como abaixo:

WeChat picture_2022082521215413.jpg 微信图片_2022082521215414.jpg 微信图片_2022082521215415.jpg 微信图片_2022082521215416.jpg 微信图片_2022082521215417.jpg

Resumir

Normalmente, se precisarmos passar ou isolar algumas variáveis ​​de thread, podemos considerar o uso do padrão de design de contexto. No cenário de negócios de separação de leitura e gravação de banco de dados, o ThreadLocal é frequentemente usado para alternar dinamicamente as fontes de dados. Mas ao usar ThreadLocal, precisamos prestar atenção ao problema de vazamentos de memória, que discutimos na explicação anterior.

Quando a thread principal leva muito tempo para processar cada solicitação, pode haver um problema de bloqueio.Neste momento, podemos considerar dividir o negócio da thread principal em uma nova thread de negócios para melhorar a capacidade de processamento paralelo do sistema. O padrão de design Thread-Per-Message e o padrão de design Worker-Thread são ambos padrões de design que melhoram a capacidade de processamento paralelo do sistema por meio da divisão de trabalho multithread.

おすすめ

転載: juejin.im/post/7135819197510058014