Pergunta

Como você unittest uma garantia segura-publicação em Java?

Para ser concreto:

Eu tenho uma interface de cache que tem um método getOrLoad (chave K, ObjectLoader loader). Coisa é, se um cache não consegue encontrar um objeto para a chave dada, então ele deve carregá-lo a partir da instância ObjectLoader. No entanto, o cache é necessário para garantir que o ato de carregar um objeto a partir do carregador e colocá-lo no cache, constitui uma publicação segura.

Agora estou no meio de escrever um teste JUnit genérico para esta interface Cache e gostaria de saber como eu iria testar que as implementações de cache aderir a esta garantia publicação segura.

Todas as idéias? O código real está no módulo parte test-systest do repositório de código no caso de você quer cutucar os arquivos reais.

Foi útil?

Solução 2

eu descobri um JavaOne apresentação por Bill Pugh, Brian Goetz e Cliff Clique sobre o assunto de testar código concorrente. Eles sugeriram esta abordagem, bruxa eu acho que é o melhor que eu já ouvi:

Um número de produtores criar objetos com estado e linha-inseguro com uma implementação de hashCode dependente do estado. Como os objetos são Sendt através do ponto synchronizatoin suposto, os hashcodes são somados (thread-localmente). Da mesma forma, os consumidores do outro lado da soma portão até as hashcodes.

No final do teste, somamos todos os resultados para os produtores e consumidores, respectivamente. Se as duas somas são iguais, o teste passa.

Nós também poderia usar XOR como uma alternativa para resumir. Na verdade, qualquer operação comutativa vai fazer. Basta ter em mente que o próprio equipamento de teste não deve apresentar qualquer sincronização adicional.

Outras dicas

Talvez você possa usar concurso para, pelo menos, dar-lhe um pouco mais de confiança que seu código está correto.

Você precisará implementar um par de testes que são executados vários threads simultaneamente. Concurso, então, aumentar a probabilidade de um erro de simultaneidade é realmente revelada por instrumentação de código byte (adicionando instruções do sono e rendimento condicionais controladas-heuristicamente).

Na verdade recebendo um erro devido à publicação inseguro é muito difícil (se alguém sabe como, me avise). A análise estática é a sua melhor aposta para uma solução automatizada. Eu iria ficar para revisão de código, e não se preocupar com isso indevidamente.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top