É bom testar uma condição, bloquear e testar novamente a condição [duplicada]
-
15-11-2019 - |
Pergunta
Possível duplicata:
Bloqueio verificado duas vezes em .net
EDITAR: muitas edições para esclarecer esta questão não é sobre singleton
Eu me pego escrevendo um código como este:
if(resourceOnDiskNeedsUpdating)
{
lock(lockObject)
{
if(resourceOnDiskNeedsUpdating) // has a previous thread already done this?
UpdateResourceOnDisk();
}
}
return LoadResourceFromDisk();
UpdateResource()
é uma operação lenta.Esse padrão faz sentido?
Existem alternativas melhores?
Solução
Isso é chamado de "bloqueio verificado duas vezes".
Você precisa de uma barreira de memória para corrigi-lo.
Ver Artigo da Wikipedia sobre bloqueio verificado duas vezes no .NET
Outras dicas
Uma alternativa que uso seria apenas usar a palavra-chave 'volátil'.http://msdn.microsoft.com/en-us/library/x13ttww7%28v=vs.71%29.aspx
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow