2010-08-10 17 views
11

Puede alguien explicar por qué esto funciona:c comportamiento # roscado

Object ready_lock = new Object(); 
    Object thread_lock = new Object(); 
    public static bool able_to_get_lock = false; 

    public void GetThreadLock() 
    { 
     if (Monitor.TryEnter(thread_lock,2)) 
     { 
      able_to_get_lock = true; 
     } 
    } 

    [TestMethod] 
    public void ThreadingModelTest() 
    { 
     Monitor.Enter(ready_lock); 
     Thread t1 = new Thread(new ThreadStart(GetThreadLock)); 
     t1.Start(); 
     Thread.Sleep(400); 
     Assert.IsTrue(able_to_get_lock); 

    } 

pero si cambio de los tipos de objeto de los objetos de bloqueo a una cadena (como abajo) se produce un error:

String ready_lock = "Hello"; 
    String thread_lock = "Hello"; 

Ha sido confundiéndome por un tiempo ahora. Gracias :)

+0

¿Cuál es la excepción que está lanzando? –

+0

Buena pregunta ... –

+0

No arroja una excepción (aparte de la falla de Assert), era simplemente que la variable able_to_get_lock devolvía falsa. –

Respuesta

14

Cuando los establece a ambos en "Hola", termina con las dos variables que tienen el mismo valor, debido a la cadena de internados. Es como hacer

Object ready_lock = new Object(); 
Object thread_lock = ready_lock; 

Así que básicamente es un caso de "si tiene dos cerraduras implicadas, que se pueden bloquear de forma independiente por diferentes hilos, pero con sólo una cerradura, sólo un hilo puede adquirir el bloqueo a una hora."

+0

Ahhhhhhhhhhhhhh ... Gracias. –

5

Es una especie de optimización, const string similares son tratados como el mismo objeto, acaba de cambiar su código:

String ready_lock = "1)Hello"; 
String thread_lock = "2)Hello"; 
+0

Cheers Dewfy, respuesta muy útil también. –