O uso do ConcurrentHashMap elimina problemas de visibilidade de dados?

Eu li o Java Concurrency in Practice e fico com esta pergunta: quando uso um ConcurrentHashMap, com quais problemas de simultaneidade de dados discutidos na Parte Um do livro ainda preciso me preocupar? Aqui estão alguns exemplos de um dos meus programas:

1. Posição atual de um profissional (um número inteiro compartilhado em que "número inteiro" é o termo matemático)

Este número representa o que um traderobjeto possui atualmente e define seu estado. Ele deve ler sua posição para saber o que fazer (procure iniciar uma nova posição ou gerenciar a atual). TraderOs métodos são executados em seu próprio encadeamento.

Um brokerobjeto é responsável por definir a traderposição do. Ele definirá a posição sempre que um dos pedidos do trader for atendido. BrokerOs métodos são executados em seu próprio encadeamento.

Ambos tradere brokerestão no mesmo pacote. A posição é implementada como um pacote privado static ConcurrentHashMap. As chaves são identificações dos objetos do trader. Os valores são Inteiro.

Externo ao pacote é o aplicativo. Ele obtém as posições dos traders indiretamente com um getter público.

As posições serão alteradas no máximo uma vez a cada poucos minutos; portanto, brokerelas não tocarão o mapa com muita frequência. No entanto, o traderaplicativo e será lido com freqüência. Além disso, muitas vezes temos vários comerciantes lendo o mapa simultaneamente.

Portanto, usando um ConcurrentHashMap dessa maneira, não preciso trabalhar com bloqueio e visibilidade de dados? O ConcurrentHashMap cuida de tudo?

2. O mercado (lance, pergunte, últimos preços)

Praticamente a mesma situação que a posição, exceto agora brokerque atualiza com frequência os preços (até 10 atualizações por segundo nos horários de pico; normalmente algumas vezes por segundo). O traderaplicativo e ainda faz leituras frequentes. As chaves do mapa agora são códigos indicando qual estoque ou futuro e os valores são objetos que mantêm os preços de mercado.

Parece funcionar bem, mas depois de ler o JCIP, percebo que o programa ainda pode ser quebrado se as coisas não forem implementadas corretamente. O livro fala sobre o ConcurrentHashMap, mas não me diz explicitamente quais são os problemas da Parte I que não precisamos mais abordar manualmente. Ele parece que eu não tenho que synchronizequalquer coisa neste caso. Isso está correto?

Resposta 1

Sim, ConcurrentHashMapcuida da visibilidade e do bloqueio, desde que:

  • valores mantidos pelo mapa são imutáveis. Parece ser verdade em sua descrição, considerando que seus objetos de preços são imutáveis;
  • você não possui operações no mapa que devem ser atômicas e não podem ser expressas como chamadas únicas para a API do mapa. Por exemplo, se você precisar de operações como 'ler valor do mapa, executar cálculos e colocar o resultado novamente no mapa' para ser atômico, você ainda precisará manter um bloqueio explícito durante esta operação ou, melhor ainda, alterar o aplicativo para apenas use operações atômicas da API do mapa, como get/put/putIfAbsent.
Resposta: 2

Eu tenho um leitor de arquivos, que retorna as linhas de um arquivo como um objeto []. Eu estou usando o método de linhas. Seria mais rápido usar o readAllLines? Não uso o fluxo para mais nada, mas quero ...

Eu tenho que baixar um arquivo xml do servidor usando o navegador IE. response.setContentType ("application / octet-stream"); response.setHeader ("Content-Disposition", "attachement; filename = xyz.xml"); ...

Eu tenho um JPanel, nele são adicionadas uma imagem e um rótulo, nessa ordem. É muito improvável que mais sejam adicionados ao painel. A formatação padrão fica bem quando é exibida, apesar de mim ...

Gostaria de saber se é possível "desenvolver quente" aplicativo de primavera. Por exemplo. No framework Play, quando altero algo no modelo ou mesmo no controlador ou na configuração, não preciso republicar o ...