2010-08-10 4 views
11

Может кто-нибудь объяснить, почему это работает:с поведением # потоковая

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 ready_lock = "Hello"; 
    String thread_lock = "Hello"; 

Это было смущаю меня какое-то время. Спасибо :)

+0

Что исключение он бросает? –

+0

Хороший вопрос .. –

+0

Он не генерирует исключение (кроме отказа Assert), переменная able_to_get_lock возвращает false. –

ответ

14

Когда вы установите их как «Hello», вы получите обе переменные, имеющие одинаковое значение, из-за интернирования строк. Это как делать

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

Так в основном это случай «, если у вас есть два замка участвуют, они могут быть независимо друг от друга заблокированы разными потоками, но только один замок, только один поток может получить блокировку на время."

+0

Ahhhhhhhhhhhhhh ... Спасибо. –

5

Это вид оптимизации, аналогичная строка сопзЬ рассматривается как тот же объект, просто изменить ваш код:

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

Cheers Dewfy, очень полезный ответ. –

Смежные вопросы