Eric Lippert tiene una excelente blog post acerca de esto. Básicamente es algo sin sentido por sí mismo.
Personalmente no confío mucho en MSDN en este frente, cuando veo esa placa de caldera. No siempre significa lo que dice. Por ejemplo, dice lo mismo acerca de Encoding
, a pesar del hecho de que todos usamos codificaciones de múltiples hilos por todos lados.
A menos que tenga alguna razón para creer lo contrario (lo cual hago con Encoding
), supongo que puedo llamar a cualquier miembro estático de cualquier hilo sin corrupción de estado global. Si quiero usar instancia miembros del mismo objeto de diferentes hilos, supongo que está bien si me aseguro, mediante el bloqueo, que solo un hilo usará el objeto a la vez. (Esto no siempre es el caso, por supuesto. Algunos objetos tienen afinidad hilo y activamente no les gusta que se utiliza desde varios subprocesos, incluso con bloqueo en su lugar. Controles de interfaz de usuario son el ejemplo obvio.)
Por supuesto, se hace complicado si los objetos se están compartiendo de forma no obvia: si tengo dos objetos que comparten una referencia a un tercero, entonces puedo terminar usando los dos primeros objetos independientemente de diferentes hilos, con el bloqueo correcto, pero aún así corrompo el tercer objeto .
Si un tipo hace anunciarse a sí mismo como seguro para subprocesos, espero que proporcione algunos detalles al respecto.Es fácil si es inmutable: puedes usar instancias como quieras sin preocuparte por ellas. Es parcial o totalmente "hilo-seguro" tipos que son mutables donde los detalles importan mucho.
Lo que la pequeña nota de MS significa es, "No hicimos mucho/ningún bloqueo en los métodos de instancia [probablemente por razones de rendimiento]. Así que si vas y le pones una docena de hilos encima, y se estropea, no lo hagas" Ven a llorar a nosotros. No es un error. Y te lo advertimos ". – cHao
@cHao: hay * mucho * más para obtener varios subprocesos en lugar de simplemente bloquear los métodos de instancia. A menudo, desea hacer que una * serie * completa de llamadas a métodos funcione atómicamente; en ese caso, ninguna cantidad de bloqueo interno ayudará. Iterar a través de una colección es el ejemplo obvio. –
@Jon: De acuerdo, hay mucho más. Pero no se puede esperar mucho más de MS, ya que la atomicidad incorporada en múltiples llamadas a los métodos ni siquiera tiene sentido para cualquiera que valore la estabilidad. (Exigiría que los documentos API digan cosas como "Si llamas a IsEmpty() y devuelve falso, DEBES llamar a Remove() o ReleaseLock() para evitar deadlocks".) E incluso en un único método, puede causar problemas de rendimiento si se usa innecesariamente. Entonces, MS no se molestó. Ese es mi punto. – cHao