Eric Lippert ha un eccellente blog post su questo. Fondamentalmente è in qualche modo privo di significato da solo.
Personalmente non mi fido di MSDN troppo su questo fronte, quando vedo quella piastra della caldaia. Non significa sempre quello che dice. Ad esempio, dice la stessa cosa su Encoding
- nonostante il fatto che tutti usiamo codifiche da più thread dappertutto.
A meno che non abbia motivo di credere altrimenti (cosa che faccio con Encoding
) presumo di poter chiamare qualsiasi membro statico da qualsiasi thread senza alcun danneggiamento dello stato globale. Se voglio usare l'istanza dell'istanza membri dello stesso oggetto da thread diversi, presumo che vada bene se assicuro - tramite il blocco - che solo un thread utilizzerà l'oggetto alla volta. (Questo non è sempre il caso, naturalmente. Alcuni oggetti hanno filo affinità e attivamente non amano essere utilizzato da più thread, anche con bloccaggio in posizione. Controlli UI sono l'esempio evidente.)
Naturalmente, diventa difficile se gli oggetti vengono condivisi in modo noncurante - se ho due oggetti che condividono ciascuno un riferimento a un terzo, allora potrei finire a usare i primi due oggetti indipendentemente da fili diversi, con tutto il blocco appropriato - ma comunque finire per danneggiare il terzo oggetto .
Se un tipo fa sì che si pubblicizzi come thread-thread, mi auguro che possa fornire alcuni dettagli a riguardo.È facile se è immutabile: puoi semplicemente utilizzare le istanze come preferisci senza preoccuparti di loro. Sono tipi parzialmente o totalmente "thread-safe" che sono mutabili dove i dettagli sono importanti.
fonte
2010-06-29 05:10:15
La piccola nota di MS significa: "Non abbiamo fatto molto/nessun blocco nei metodi di istanza [probabilmente per motivi di prestazioni]. Quindi se ci vai e una dozzina di thread su di esso, e fa casino, don ' Vieni a piangere da noi, non è un bug e ti abbiamo avvertito ". – cHao
@cHao: C'è molto * molto di più per ottenere diritti multi-threading rispetto al semplice blocco dei metodi di istanza. Spesso si desidera rendere funzionante atomicamente un'intera * serie * di chiamate al metodo, in questo caso nessuna quantità di blocco interno sarà di aiuto. L'iterazione attraverso una collezione è l'ovvio esempio. –
@Jon: D'accordo, c'è molto di più. Ma non c'è molto di più di ciò che ci si aspetterebbe dalla MS, dato che l'atomicità integrata tra più chiamate di metodo non ha nemmeno senso da parte di chiunque apprezzi la stabilità. (Avrebbe bisogno di documenti API che dicessero cose come "Se chiami IsEmpty(), e restituisce false, DEVI chiamare Remove() o ReleaseLock() per evitare deadlock"). E anche in un singolo metodo, può causare problemi di prestazioni se è usato inutilmente. Quindi MS giustamente non si è preoccupato. Questo è il mio punto. – cHao