Si pasas un tipo de valor, se encaja y la próxima vez que el código se ejecute aquí, volverá a estar en caja y no será el mismo objeto dos veces, así que no puede bloquearse
Cerradura(x)
{ ...
}
El bloqueo se realiza realmente a través del objeto Monitor:
Lo anterior es equivalente a:
System.Object obj = (System.Object)x; System.Threading.Monitor.Enter(obj); Prueba
{ ...
} finalmente
{ System.Threading.Monitor.Exit(obj);
}
Luego, citando las palabras originales de MSDN: Usa Monitor para bloquear objetos (es decir, tipos de referencia), no tipos de valor. Cuando pasas una variable de tipo valor a Enter, se guarda como un objeto. Si pasas la misma variable a Enter de nuevo, se encaja como un objeto separado y el hilo no se bloquea. En este caso, el código que Monitor supuestamente protege no está protegido. Además, cuando pasas la variable a Salida, se crea otro objeto separado. Como el objeto pasado a Salida es diferente del objeto pasado a Enter, Monitor lanza SynchronizationLockException. Para más información, consulta el tema conceptual Monitores. |