Como é que HashMap.computeIfAbsent falhar sob uso de vários segmentos?

John Dough:

A documentação para java.util.HashMap afirma claramente: "Se vários segmentos acessar um mapa de hash simultaneamente, e pelo menos um dos modifica linhas do mapa estruturalmente, deve ser sincronizado externamente."

No entanto, considere o caso de uso onde você usar o mapa como um cache para reduzir a criação do objeto imutável, onde apenas computeIfAbsent é chamado no HashMap (sem remoção / expulsão). E a única coisa que importa é que computeIfAbsent retornar um objeto válido; você não se importa se computeIfAbsent ocasionalmente produz objetos extras ou substitui uma entrada existente.

Qual é a pior coisa que poderia acontecer? Em meus testes ocasional não há consequências negativas. (Eu usaria ConcurrentHashMap, mas é relativamente lento neste caso de uso.)

GhostCat saudações Monica C.:

O problema aqui: se em tudo, que a segurança do thread seria uma implementação detalhes. Poderia acontecer de trabalhar fora para uma versão JVM, mas ser ligeiramente diferente, ou "off" em alguma outra versão do java.util.HashMap.

Citando uma outra resposta :

Dito isto, as implementações mapa mais comumente utilizados, especificamente HashMap não são thread-safe. A adição de elementos de diferentes segmentos podem deixar o mapa num estado incoerente, onde por exemplo, elementos que foram inseridos não pode ser reactivado embora de dimensão (programas) que eles estão presentes.

Em outras palavras: mesmo se você não tem um problema de hoje, basta mudar para uma versão java diferente teoricamente poderia abrir seu projeto ao fracasso.

Tenha em mente: a única garantia que você tem é a interface Map. Você está usando um recipiente que tem uma estrutura interna que se atualizados por vários segmentos. Se isso acontecer para não causar inconsistências em seguida, que é pura coincidência .

Se a leitura ea escrita para HashMap seria "apenas trabalho" nas configurações de vários segmentos, por que ConcurrentHashMap ser necessário, em primeiro lugar ?!

Acho que você gosta

Origin http://43.154.161.224:23101/article/api/json?id=234016&siteId=1
Recomendado
Clasificación