Эрик Липперт имеет превосходное сообщение в блоге об этом. По сути, это само по себе несколько бессмысленно.
Лично я не слишком доверяю MSDN на этом фронте, когда я вижу эту плиту. Это не всегда означает, что это говорит. Например, он говорит то же самое о Encoding
- несмотря на то, что мы все используем кодировки из нескольких потоков повсюду.
Если у меня нет причин полагать иначе (что я делаю с Encoding
), я предполагаю, что могу вызывать любой статический член из любого потока без повреждения глобального состояния. Если я хочу использовать instance членов одного и того же объекта из разных потоков, я предполагаю, что все в порядке, если я гарантирую - посредством блокировки - что только один поток будет использовать объект одновременно. (Конечно, это не всегда так. Некоторые объекты имеют сходство потоков и активно не любят, когда их используют из нескольких потоков, даже с блокировкой на месте. Очевидным примером являются элементы управления пользовательским интерфейсом.)
Конечно, становится непросто, если объекты используются совместно неочевидно - если у меня есть два объекта, каждый из которых имеет ссылку на третий, то я могу в конечном итоге использовать первые два объекта независимо от разных потоков со всей надлежащей блокировкой. - но все же в конечном итоге портит третий объект.
Если тип действительно объявляет себя потокобезопасным, я надеюсь, что он даст некоторые подробности об этом. Это легко, если он неизменен - вы можете просто использовать экземпляры так, как вам нравится, не беспокоясь о них. Это частично или полностью «поточно-ориентированные» типы, которые могут изменяться, если детали имеют большое значение.