2010-08-10 16 views
11

Może ktoś wyjaśnić, dlaczego to działa:c zachowanie # gwintowania

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); 

    } 

ale jeśli zmienię typy Przedmiot obiektów blokujących do String (jak poniżej) nie powiedzie się:

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

Minęły myląc mnie przez chwilę. Dzięki :)

+0

Co jest wyjątkiem jest rzucanie? –

+0

Ładne pytanie .. –

+0

Nie rzuca wyjątku (z wyjątkiem błędu Assert), po prostu zmienna able_to_get_lock zwraca false. –

Odpowiedz

14

Po ustawieniu obu na "Hello", kończy się na obu zmiennych o tej samej wartości, ze względu na interakcje ciąg. To tak jak robi

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

Więc w zasadzie jest to przypadek „, jeśli masz dwa zamki zaangażowany, mogą być niezależnie zablokowana przez różnych wątków, ale tylko z jednym zamkiem, tylko jeden wątek można nabyć blokadę przy czas."

+0

Ahhhhhhhhhhhhhh ... Dziękuję. –

5

To niby optymalizacji podobny ciąg const są traktowane jako ten sam przedmiot, wystarczy zmienić Ci kod:

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

Pozdrowienia Dewfy, bardzo pomocna odpowiedź. –