Потоковое поведение С#

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

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