O concorrente (CHM para abreviação) foi introduzido no Java 1.5 como uma alternativa à hashtable e é um membro importante do pacote concorrente. Antes do Java 1.5, se você deseja implementar um mapa que possa ser usado com segurança em programas multidreados e simultâneos, você pode escolher apenas o mapa de hashtable e sincronizado, porque o hashmap não é seguro para threads. Mas depois de apresentar o CHM, temos uma escolha melhor. O CHM não é apenas seguro para roscas, mas também tem um desempenho melhor que o hashtable e o SynchronizedMap. Comparado com hashtable e syncronizedmap, o mapa inteiro está bloqueado e o CHM trava apenas alguns mapas. O CHM permite operações de leitura simultânea, mantendo a integridade dos dados durante as operações de gravação por meio de bloqueios síncronos. Aprendemos o básico do CHM nas 5 melhores coleções java concorrentes do JDK 5 e 6. Neste blog, apresentarei os seguintes pontos:
Implementação de Concurrenthashmap em Java
O CHM apresenta a segmentação e fornece todos os recursos suportados pela Hashtable. No CHM, o Multithreading é suportado para ler mapa e não requer nenhum bloqueio. Isso se deve ao fato de o CHM dividir o mapa em diferentes partes, travando apenas parte dele ao executar a operação de atualização. De acordo com o nível de simultaneidade padrão, o mapa é dividido em 16 partes e é controlado por bloqueios diferentes. Isso significa que até 16 threads de gravação podem operar o mapa ao mesmo tempo. Imagine que, de apenas um thread que entra em 16 threads de gravação que entram ao mesmo tempo (os threads de leitura são quase ilimitados), a melhoria do desempenho é óbvia. No entanto, como algumas operações de atualização, como put (), remover (), Putall () e clear (), apenas bloquear a operação, a operação de pesquisa não pode garantir que os resultados mais recentes serão retornados.
Outro ponto importante é que, quando iterando o CHM, o iterador retornado pelo Keyset é fracamente consistente e seguro de falha, e pode não retornar algumas alterações recentes. Durante a travessia, se o conteúdo da matriz que tiver sido percorrido alterações, a exceção concorrente de exceção dosceto não será lançada.
O nível de concorrência padrão do CHM é 16, mas pode ser alterado por um construtor ao criar CHM. Não há dúvida de que o nível de simultaneidade representa o número de operações de atualização simultâneas; portanto, se apenas alguns threads atualizarão o mapa, é recomendável definir um baixo nível de concorrência. Além disso, o CHM também usa o ReentrantLock para bloquear segmentos.
Exemplo de método concorrente de putifabsent em java
Muitas vezes queremos inserir elementos quando eles não existem, e geralmente escrevemos código como o seguinte
sincronizado (map) {if (map.get (key) == null) {return map.put (chave, valor); } else {return map.get (key); }}O código acima é fácil de usar no hashmap e hashtable, mas há um risco de erros no CHM. Isso ocorre porque o CHM não bloqueia o mapa inteiro durante a operação de put; portanto, quando um thread é colocado (k, v), outro encadeamento chama (k) e obtém nulo, o que causará o valor de um encadeamento colocado para ser substituído pelo valor de outro thread. Obviamente, você pode encapsular o código em um bloco de código sincronizado, que tornará seu código um thread único, embora seguro de threads. O método putifabsent (chave, valor) fornecido pelo CHM implementa a mesma função atomicamente, evitando o risco de concorrência de encadeamentos acima.
Quando usar o concorrente
O CHM é adequado para quando o número de leitores excede o número de leitores e, quando o número de leitores é maior ou igual ao leitor, o desempenho do CHM é menor que o mapa de hashtable e sincronizado. Isso ocorre porque, quando o mapa inteiro está bloqueado, a operação de leitura aguarda o thread que executa a operação de gravação na mesma parte para terminar. O CHM é adequado para fazer cache, inicializado no início do programa e pode ser acessado por vários threads solicitando. Como Javadoc explica, o CHM é uma boa alternativa à hashtable, mas lembre -se de que o CHM tem um pouco menos de sincronização do que a hashtable.
Resumir
Agora sabemos o que é simultaneamente e quando usar o ConcurrentHashMap. Vamos revisar alguns pontos -chave do CHM.
Os acima são os cenários de implementação e uso do CHM em Java, espero que possa ajudar a todos! Obrigado pelo seu apoio a este site!