Потоковое поведение С#
Может ли кто-нибудь объяснить, почему это работает:
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";
Это немного смутило меня. Спасибо:)
Ответы
Ответ 1
Когда вы установите их как "Hello", вы получите обе переменные, имеющие одинаковое значение, из-за интернирования строк. Это нравится делать
Object ready_lock = new Object();
Object thread_lock = ready_lock;
Итак, в основном это случай "если у вас есть две блокировки, они могут быть независимо заблокированы разными потоками, но только с одним замком, только один поток может получить блокировку за раз".
Ответ 2
Это своего рода оптимизация, аналогичная константная строка рассматривается как один и тот же объект,
просто измените код:
String ready_lock = "1)Hello";
String thread_lock = "2)Hello";