2010-08-10 19 views
11

Kann mir jemand erklären, warum dies funktioniert:C# threading Verhalten

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

    } 

aber wenn ich die Objekttypen der Verriegelungs Objekte in einen String (wie unten) ändern versagt es:

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

Es war verwirrte mich jetzt schon eine Weile. Danke :)

+0

Was ist die Ausnahme sie werfen wird? –

+0

Schöne Frage .. –

+0

Es wirft keine Ausnahme (abgesehen von der Assert fehlgeschlagen), es war einfach die Variable able_to_get_lock ist falsch zurückgegeben. –

Antwort

14

Wenn Sie beide auf "Hello" setzen, haben Sie am Ende beide Variablen mit dem gleichen Wert, aufgrund der String Interning. Es ist wie zu tun

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

Also im Grunde ist es ein Fall von „, wenn Sie zwei Schleusen beteiligt haben, können sie unabhängig von verschiedenen Threads gesperrt werden, aber mit nur einem Schloss, nur ein Thread kann die Sperre auf einem erwerben Zeit."

+0

Ahhhhhhhhhhhhhh ... Danke. –

5

Es ist eine Art von Optimierung, ähnlich const string werden als das gleiche Objekt behandelt, nur Sie Code ändern:

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

Cheers Dewfy, sehr hilfreiche Antwort. –