¿Es bueno probar una condición y luego bloquear y volver a probar la condición

Posible duplicado:
Doble control de locking en .net

EDIT: muchas ediciones para aclarar esta pregunta no se trata de singleton

Me encuentro escribiendo código así:

if(resourceOnDiskNeedsUpdating) { lock(lockObject) { if(resourceOnDiskNeedsUpdating) // has a previous thread already done this? UpdateResourceOnDisk(); } } return LoadResourceFromDisk(); 

UpdateResource() es una operación lenta. ¿Tiene sentido este patrón?
¿Hay mejores alternativas?

Esto se llama “doble comprobación de locking”.

Necesitas una valla de memoria para hacerlo correcto.

Vea el artículo de Wikipedia sobre el locking doble.

Una alternativa que utilizo sería simplemente usar la palabra clave ‘volátil’. http://msdn.microsoft.com/en-us/library/x13ttww7%28v=vs.71%29.aspx