НАЧАТЬ РЕДАКТИРОВАТЬ
Судя по вашему отредактированному заголовку, сам оператор слияния нуля кажется поточно-ориентированным (см. Анализ Фила Хаака ). Похоже, однако, что он не гарантирует от потенциальных множественных вызовов конструктора StringBuilder.
КОНЕЦ РЕДАКТИРОВАНИЯ
У вас есть большая проблема с многопоточностью, и это то, что само свойство Builder представляет состояние, которое может совместно использоваться потоками. Даже если вы сделаете ленивый поток инициализации безопасным, нет гарантии, что методы, использующие Builder, делают это потокобезопасным способом.
// 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;
}
}
Вышеуказанное предотвратит проблему с многопоточностью при отложенной инициализации _builder, но если вы не синхронизируете свои вызовы с методами экземпляра StringBuilder, вам не гарантируется безопасность потоков в любых методах, которые используют свойство Builder. Это связано с тем, что методы экземпляра в StringBuilder не были разработаны для обеспечения безопасности потоков. См. Текст ниже со страницы MSDN StringBuilder .
Любая общедоступная статика (Shared в Visual
Основные) члены этого типа являются потоками
безопасный. Любые члены экземпляра не являются
гарантированно безопасен для потоков.
Если вы используете StringBuilder в нескольких потоках, вам, вероятно, лучше будет инкапсулировать его в своем классе. Сделайте Builder приватным и покажите, какое поведение вам нужно в качестве публичного метода:
public void AppendString(string toAppend)
{
lock (Builder)
{
Builder.Append(toAppend);
}
}
Таким образом, вы не пишете код синхронизации повсеместно.