BEGIN EDYCJA
podstawie edytowanego tytułu, sam operator null koalescencyjny wydaje się być bezpieczny wątku (patrz Phil Haack's analysis). Wydaje się jednak, że nie gwarantuje to potencjalnym wielokrotnym wywołaniom konstruktora StringBuilder.
END EDIT
masz większy problem z gwintem, a to, że nieruchomość sama Builder reprezentuje stan, który może być współdzielona przez wątkach. Nawet jeśli sprawisz, że wątek inicjalizacji będzie bezpieczny, nie ma gwarancji, że metody zużywające Buildera robią to w sposób bezpieczny dla wątków.
// 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;
}
}
Powyższe spowoduje problem wątków w leniwej inicjalizacji _builder, ale chyba zsynchronizować połączenia metod instancji StringBuilder, nie masz zagwarantowane bezpieczeństwo wątków w dowolnych metod, które zużywają właściwość Builder. Wynika to z tego, że metody instancji w StringBuilder nie zostały zaprojektowane jako bezpieczne dla wątków. Zobacz poniższy tekst z MSDN StringBuilder page.
Wszystkie publiczne statyczny (Shared w języku Visual Basic) członków tego typu są bezpieczne wątek . Dowolne elementy instancji nie są gwarantowane jako bezpieczne dla wątków.
Jeśli spożywasz StringBuilder w wielu wątkach, prawdopodobnie lepiej jest ci go zamknąć w swojej klasie. Dokonaj Builder prywatne i odsłonić to, co trzeba zachowanie jako metoda publicznego:
public void AppendString(string toAppend)
{
lock (Builder)
{
Builder.Append(toAppend);
}
}
W ten sposób nie piszesz kod synchronizacji w każdym miejscu.
Specyfikacja C# ostrożnie określa, jakie operacje są atomowe; Operatory koalescencyjne zerowe nie są atomowe. Operator koalescencji zerowej jest tylko cukrem syntaktycznym dla twojego pierwszego kawałka kodu. Ale masz tu większe problemy; kogo to obchodzi, jeśli pole jest bezpieczne dla wątków? Konstruktor nie jest bezpieczny dla wątków! –
W przypadku przyszłych pytań w tym temacie pomocne byłoby podanie dokładnej definicji dokładnie tego, co oznacza "bezpieczna dla nici". Bezpieczeństwo gwintów nie jest absolutne; raczej kod jest bezpieczny dla wątków, jeśli umowa użytkowania zaimplementowana przez wywołujących jest zgodna z oczekiwaną przez odbiorcę. Nie wiedząc, jakiego kontraktu oczekujesz, nie można powiedzieć, czy kod podąża za nim, czy nie. –