me encontré con algo de código Singleton hoy en nuestra base de código y no estaba seguro de si el siguiente era seguro para subprocesos:atomicidad de C# coalescente operador
public static IContentStructure Sentence{
get {
return _sentence ?? (_sentence = new Sentence());
}
}
Esta afirmación es equivalente a:
if (_sentence != null) {
return _sentence;
}
else {
return (_sentence = new Sentence());
}
Creo que ?? es solo un truco de compilación y que el código resultante aún NO es atómico. En otras palabras, dos o más hilos podrían encontrar que _sentence sea nulo antes de establecer _sentencia en una nueva Sentencia y devolverla.
Para garantizar la atomicidad, tendríamos que cerrar ese trozo de código:
public static IContentStructure Sentence{
get {
lock (_sentence) { return _sentence ?? (_sentence = new Sentence()); }
}
}
Es eso todo correcto?
http://csharpindepth.com/Articles/General/Singleton.aspx – SLaks
Excepto que no se puede bloquear en algo que es nula, por lo que su solución no va a funcionar. – vcsjones
buen punto. Sí, tendrías que crear otro objeto para cerrar. Buena atrapada. – Adam