开始编辑
根据您编辑的标题,空合并运算符本身似乎是线程安全的(请参阅Phil Haack 的分析)。然而,它似乎并不能保证对 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 页面中的以下文本。
此类型的任何公共静态(在 Visual Basic 中为 Shared)成员都是线程安全的。不保证任何实例成员都是线程安全的。
如果您在多个线程中使用 StringBuilder,则最好将其封装在您的类中。将 Builder 设为私有并将您需要的行为公开为公共方法:
public void AppendString(string toAppend)
{
lock (Builder)
{
Builder.Append(toAppend);
}
}
这样,您就不会到处编写同步代码。