2010-08-10 61 views
11

任何人都可以解释为什么这个工程:C#线程行为

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

    } 

,但如果我改变的对象类型锁定对象的一个​​String(如下)失败:

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

它已经现在让我困惑一阵子。谢谢:)

+0

什么是例外,它是扔? – 2010-08-10 13:33:47

+0

不错的问题.. – 2010-08-10 13:37:24

+0

它不会抛出一个异常(除了Assert失败),它只是简单的说就是able_to_get_lock变量返回false。 – 2010-08-10 13:46:26

回答

14

当您将它们都设置为“Hello”时,由于字符串interning,最终两个变量具有相同的值。这就像做

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

所以基本上它是:“如果你有两个锁介入,它们可以分别由不同的线程锁定的情况下,但只有一个锁,只有一个线程可以获取在锁时间。”

+0

Ahhhhhhhhhhhhhh ... Thankyou。 – 2010-08-10 13:44:14

5

这是一种优化,类似的常量字符串中被视为同一个对象, 只是改变你的代码:

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

干杯Dewfy,非常有帮助的答案。 – 2010-08-10 13:50:18