Est-il bon de tester une condition puis de la verrouiller puis de re-tester la condition [duplicata]
-
15-11-2019 - |
Question
Doublon possible :
Verrouillage revérifié dans .net
MODIFIER: beaucoup de modifications pour clarifier cette question ne concerne pas singleton
Je me retrouve à écrire du code comme ceci :
if(resourceOnDiskNeedsUpdating)
{
lock(lockObject)
{
if(resourceOnDiskNeedsUpdating) // has a previous thread already done this?
UpdateResourceOnDisk();
}
}
return LoadResourceFromDisk();
UpdateResource()
est une opération lente.Ce modèle a-t-il un sens ?
Existe-t-il de meilleures alternatives ?
La solution
C'est ce qu'on appelle un "verrouillage à double contrôle".
Vous avez besoin d'une barrière de mémoire pour que cela soit correct.
Voir Article de Wikipédia sur le verrouillage à double vérification dans .NET
Autres conseils
Une alternative que j'utilise serait d'utiliser simplement le mot-clé « volatile ».http://msdn.microsoft.com/en-us/library/x13ttww7%28v=vs.71%29.aspx
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow