2010-08-10 35 views
11

bất cứ ai có thể giải thích lý do tại sao công trình này:c hành vi # luồng

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

    } 

nhưng nếu tôi thay đổi loại đối tượng của các đối tượng khóa vào một String (như dưới đây) nó không thành công:

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

Đã làm tôi bối rối một lúc. Cảm ơn :)

+0

gì được ngoại trừ nó được ném? –

+0

Câu hỏi hay .. –

+0

Nó không ném một ngoại lệ (ngoài Assert thất bại), nó chỉ đơn giản là biến sports_to_get_lock trả về false. –

Trả lời

14

Khi bạn đặt cả hai thành "Xin chào", bạn kết thúc với cả hai biến có cùng giá trị, do thực hiện chuỗi ký tự. Nó giống như làm

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

Vì vậy, về cơ bản nó là một trường hợp "nếu bạn đã có hai ổ khóa có liên quan, họ có thể bị khóa một cách độc lập bởi chủ đề khác nhau, nhưng chỉ với một khóa, chỉ có một thread có thể có được khóa ở một thời gian."

+0

Ahhhhhhhhhhhhhh ... Cảm ơn. –

5

Nó là loại tối ưu hóa, const string tương tự đang được coi là cùng một đối tượng, chỉ cần thay đổi mã bạn:

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

Chúc mừng Dewfy, câu trả lời rất hữu ích là tốt. –