Eric Lippert ma znakomitą blog post na ten temat. Zasadniczo jest to trochę bezsensowne samo w sobie.
Osobiście nie ufam zbytnio MSDN z przodu, gdy widzę tę płytę kotła. Nie zawsze oznacza to, co mówi. Na przykład, mówi to samo o Encoding
- pomimo faktu, że wszyscy używamy kodowania z wielu wątków w każdym miejscu.
O ile nie ma powodu sądzić, że jest inaczej (co robię z Encoding
) zakładam, że mogę wywołać dowolnego statycznego członka z dowolnego wątku bez korupcji stanu globalnego. Jeśli chcę użyć instancji członków tego samego obiektu z różnych wątków, zakładam, że to w porządku, jeśli zapewniam - przez blokowanie - że tylko jeden wątek będzie używać obiektu na raz. (Oczywiście nie zawsze tak jest.) Niektóre obiekty mają powinowactwo gwintu i aktywnie nie lubią być używane z wielu wątków, nawet z blokowaniem w miejscu. Przykładami są tutaj kontrolki interfejsu użytkownika.)
Oczywiście, staje się to trudne jeśli obiekty są udostępniane w sposób nieoczywisty - jeśli mam dwa obiekty, z których każdy ma odniesienie do trzeciego, to mogę w końcu użyć dwóch pierwszych obiektów niezależnie od różnych wątków, z właściwym blokowaniem - ale nadal w końcu uszkodzić trzeci obiekt .
Jeśli typ powoduje, że reklamuje się jako bezpieczny dla wątków, mam nadzieję, że poda szczegóły na jego temat.To proste, jeśli jest niezmienne - możesz po prostu użyć instancji, które ci się podobają, bez martwienia się o nie. Są to typy częściowo lub całkowicie "wątkowe", które są zmienne, gdy szczegóły mają duże znaczenie.
Co oznacza mała notatka MS, brzmi: "Nie zrobiliśmy wiele/żadnych blokad w metodach instancji [prawdopodobnie ze względu na wydajność], więc jeśli przejdziecie i sic tuzin wątków na tym, a to zabrzmi, nie" Przychodzą do nas płaczące, to nie jest błąd i ostrzegaliśmy cię. – cHao
@CHao: Jest dużo * więcej, aby uzyskać wielowątkowość w prawo niż po prostu zablokować metody instancji. Często chcesz, aby cała * seria * wywołań metodowych działała atomowo - w takim przypadku nie pomoże żadna ilość wewnętrznego blokowania. Iterowanie poprzez kolekcję jest oczywistym przykładem. –
@Jon: Zgoda, jest o wiele więcej. Ale nie ma o wiele więcej, czego można by się spodziewać po SM, ponieważ wbudowana atomowość w wielu wywołaniach metod nie ma nawet sensu od każdego, kto ceni sobie stabilność. (Wymagałoby to dokumentów API, które mówią takie rzeczy jak "Jeśli wywołasz IsEmpty(), i zwraca false, musisz zadzwonić Remove() lub ReleaseLock(), aby uniknąć zakleszczenia".) A nawet w jednej metodzie, może to spowodować problemy z wydajnością, jeśli są używane niepotrzebnie. Więc stwardnienie rozsiane słusznie nie zawracało sobie głowy. To mój punkt. – cHao