BEGIN EDIT
Dựa trên tiêu đề thay đổi nội dung của bạn, các nhà điều hành null-coalescing bản thân có vẻ là thread-safe (xem Phil Haack's analysis). Nó xuất hiện, tuy nhiên, nó không đảm bảo chống lại các cuộc gọi nhiều tiềm năng đến các nhà xây dựng StringBuilder.
END EDIT
Bạn có một vấn đề lớn hơn với luồng, và đó là những Builder tài sản riêng của mình đại diện cho nhà nước có thể được chia sẻ trên chủ đề. Ngay cả khi bạn làm cho thread khởi tạo lười biếng an toàn, không có gì đảm bảo rằng các phương thức tiêu thụ Builder đang thực hiện nó theo một cách an toàn.
// 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;
}
}
trên sẽ ngăn chặn vấn đề luồng trong việc khởi tạo lười biếng của _builder, nhưng trừ khi bạn đồng bộ hóa các cuộc gọi của bạn với các phương pháp thể hiện của StringBuilder, bạn đang không được bảo đảm an toàn thread trong bất kỳ phương pháp mà tiêu thụ tài sản Builder. Điều này là do các phương thức thể hiện trong StringBuilder không được thiết kế để làm chủ đề an toàn. Xem văn bản bên dưới từ MSDN StringBuilder page.
Bất kỳ thành phần tĩnh công cộng nào (được chia sẻ trong Visual Cơ bản) thuộc loại này là sợi an toàn. Bất kỳ thành viên cá thể nào không phải là được đảm bảo là chuỗi an toàn.
Nếu bạn đang sử dụng StringBuilder trong nhiều chủ đề, bạn có thể phục vụ tốt hơn đóng gói nó trong lớp học của bạn. Đặt Trình tạo riêng tư và hiển thị hành vi nào bạn cần theo phương thức công khai:
public void AppendString(string toAppend)
{
lock (Builder)
{
Builder.Append(toAppend);
}
}
Bằng cách này bạn không viết mã đồng bộ trên toàn bộ địa điểm.
Nguồn
2009-06-03 13:19:29
Đặc tả C# cẩn thận gọi ra những hoạt động nào là nguyên tử; null toán tử kết hợp không phải là nguyên tử. Toán tử kết hợp không chỉ là một cú pháp cú pháp cho đoạn mã đầu tiên của bạn. Nhưng bạn có vấn đề lớn hơn ở đây; ai quan tâm nếu trường là an toàn? Người xây dựng không an toàn! –
Đối với câu hỏi trong tương lai trong tĩnh mạch này, nó sẽ giúp nếu bạn cung cấp một định nghĩa cẩn thận từ chính xác những gì "thread an toàn" có nghĩa là cho bạn. An toàn chủ đề không phải là tuyệt đối; thay vào đó, mã là thread an toàn nếu hợp đồng sử dụng được thực hiện bởi người gọi tương thích với dự kiến của callee. Không biết bạn đang mong đợi gì, bạn không thể nói liệu mã có tuân theo hay không. –