Programação simultânea em java em profundidade - ConcurrentHashMap

Este artigo é para ler notas, o livro é a arte da programação simultânea em Java.O
livro parece ser
1.6.Eu descobri que o jdk8 não consegue encontrar os segmentos.

1. Por que usar o ConcurrentHashMap?

Em um ambiente multithread, o uso do HashMap para operações de venda causará um loop infinito, resultando em utilização da CPU próxima a 100%, portanto, o HashMap não pode ser usado em situações simultâneas.

O HashMap causará um loop infinito ao executar operações de colocação simultânea, porque o multithreading fará com que a lista vinculada do HashMap Entry forme uma estrutura de dados em anel. Depois que a estrutura de dados em anel for formada, o próximo nó da Entrada nunca ficará vazio e um loop infinito será gerado para obter a Entrada.

O princípio é: ao adicionar elementos ao HashMap, isso fará com que a expansão do contêiner HashMap
possa se referir a

A tecnologia de segmentação de bloqueio do ConcurrentHashMap pode melhorar efetivamente a taxa de acesso simultâneo; a razão pela qual o contêiner HashTable mostra ineficiência em um ambiente simultâneo altamente competitivo é que todos os threads que acessam o HashTable devem competir pelo mesmo bloqueio. Se houver vários bloqueios no contêiner , Cada bloqueio é usado para bloquear parte dos dados no contêiner, portanto, quando vários encadeamentos acessam dados em diferentes segmentos de dados no contêiner, não haverá competição entre bloqueios, o que pode efetivamente melhorar a eficiência do acesso simultâneo.Este é o bloqueio usado pelo ConcurrentHashMap Tecnologia de segmentação.

2. A estrutura do ConcurrentHashMap (não a estrutura 1.8)

Insira a descrição da imagem aqui
Segmento é um bloqueio reentrante (ReentrantLock), que desempenha o papel de bloqueio no ConcurrentHashMap;

HashEntry é usado para armazenar dados de valor-chave.

Um ConcurrentHashMap contém uma matriz de segmentos.

Um segmento contém uma matriz HashEntry. Cada HashEntry é um elemento de uma estrutura de lista vinculada. Cada segmento protege os elementos em uma matriz HashEntry. Ao modificar os dados da matriz HashEntry, primeiro você deve obter o bloqueio do segmento correspondente a ele .

static class Segment<K,V> extends ReentrantLock implements Serializable {

    }

Pode-se ver que o segmento herda de ReentrantLock, você sabe, pode atuar como um bloqueio

jdk1.6 ConcurrentHashMap consulte este artigo

Estrutura ConcurrentHashMap (estrutura 1.8)

CAS + sincronizado + hashentry

https://blog.csdn.net/programmer_at/article/details/79715177

A diferença entre jdk1.7 e 1.8

https://www.jianshu.com/p/e694f1e868ec
https://blog.csdn.net/xingxiupaioxue/article/details/88062163

O ConcurrentHashMap pode substituir completamente o HashTable?

Consistência forte e consistência fraca

De fato, existem apenas dois tipos de consistência de dados, consistência forte e consistência fraca. Consistência forte também é chamada de consistência linear.Além disso, toda a outra consistência é um caso especial de consistência fraca. A chamada consistência forte significa que a replicação é síncrona e a consistência fraca significa que a replicação é assíncrona.

O usuário atualiza o avatar do site.Em algum momento, o usuário envia uma solicitação de atualização para a biblioteca principal e a biblioteca principal recebe a solicitação logo após. Em um determinado momento, o banco de dados mestre encaminhará as alterações de dados para seu próprio banco de dados escravo. Por fim, a biblioteca principal informa ao usuário que a atualização foi bem-sucedida.

Se a biblioteca principal precisar aguardar a confirmação da biblioteca escrava antes de retornar a "atualização bem-sucedida" e tornar o novo avatar visível para outros usuários, para garantir que a biblioteca escrava tenha recebido uma operação de gravação, a replicação é sincronizada, ou seja, consistência forte. Se a biblioteca principal gravar com êxito e não esperar pela resposta da biblioteca escrava, ela retornará "atualização com êxito" diretamente, a replicação será assíncrona, ou seja, consistência fraca.

A consistência forte pode garantir que a biblioteca escrava tenha dados consistentes com a biblioteca mestre. Se a biblioteca principal cair de repente, ainda podemos garantir a integridade dos dados. No entanto, se a biblioteca secundária estiver inativa ou a rede estiver bloqueada, a biblioteca primária não poderá concluir a operação de gravação.

Na prática, geralmente tornamos uma biblioteca escrava síncrona, enquanto outras são assíncronas. Se houver algum problema com este escravo síncrono, faça outro escravo assíncrono sincronizar. Isso garante que sempre haja dois nós com dados completos: a biblioteca principal e a biblioteca escrava síncrona. Essa configuração é chamada semi-síncrona.

https://my.oschina.net/hosee/blog/675423

Publicado 37 artigos originais · ganhou elogios 6 · vista 4630

Acho que você gosta

Origin blog.csdn.net/littlewhitevg/article/details/105604100
Recomendado
Clasificación