COMENZAR EDITAR
Sobre la base de su título editado, el propio operador nulo coalescencia parece ser seguro para subprocesos (ver Phil Haack's analysis). Sin embargo, parece que no garantiza contra las posibles llamadas múltiples al constructor StringBuilder.
FIN EDITAR
Usted tiene un problema más grande con rosca, y es que la propia propiedad del constructor representa el estado que pueden ser compartidos a través de las discusiones. Incluso si hace que el subproceso de inicialización diferido sea seguro, no hay garantía de que los métodos que consumen el Creador lo hagan de manera segura.
// below code makes the getter thread safe
private object builderConstructionSynch = new object();
public StringBuilder Builder
{
get
{
lock (builderConstructionSynch)
{
if (_builder == null) _builder = new StringBuilder();
}
return _builder;
}
}
Lo anterior evitará el problema de roscado en la inicialización perezosa de _builder, pero a menos que sincronice sus llamadas a los métodos de instancia de StringBuilder, usted no está garantizada la seguridad de rosca en cualquiera de los métodos que consumen la propiedad del constructor. Esto se debe a que los métodos de instancia en StringBuilder no fueron diseñados para ser seguros para subprocesos. Vea el texto a continuación del MSDN StringBuilder page.
estáticos públicos (Shared en Visual Basic) de este tipo son el hilo seguro. Los miembros de instancia no son garantizados para ser seguro para subprocesos.
Si consume StringBuilder en varios subprocesos, probablemente será mejor que lo encapsule en su clase. Hacer constructor privado y exponer lo que necesita el comportamiento como un método público:
public void AppendString(string toAppend)
{
lock (Builder)
{
Builder.Append(toAppend);
}
}
De esta manera usted no está escribiendo código de sincronización por todo el lugar.
La especificación C# indica cuidadosamente qué operaciones son atómicas; los operadores coalescentes nulos no son atómicos. El operador nulo coalescente es solo un azúcar sintáctico para su primer fragmento de código. Pero tienes problemas más grandes aquí; a quién le importa si el campo es seguro para la rosca? ¡El constructor no es seguro para los hilos! –
Para futuras preguntas en este sentido, sería útil si proporcionara una definición cuidadosamente redactada de exactamente qué significa "hilo seguro" para usted. La seguridad del subproceso no es absoluta; más bien, el código es seguro para subprocesos si el contrato de uso implementado por los llamantes es compatible con el esperado por el destinatario. Sin saber qué contrato espera, es imposible decir si el código lo sigue o no. –