代码之家  ›  专栏  ›  技术社区  ›  probably at the beach

C线程行为

  •  11
  • probably at the beach  · 技术社区  · 14 年前

    有人能解释一下为什么这样做有效吗?

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

    我一时糊涂了。谢谢)

    2 回复  |  直到 14 年前
        1
  •  14
  •   Jon Skeet    14 年前

    当您将两个变量都设置为“hello”时,由于字符串插入,最后两个变量的值相同。就像做

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

    所以基本上是这样的:“如果你有两个锁,它们可以被不同的线程独立地锁定,但是只有一个锁,一次只有一个线程可以获取锁。”

        2
  •  5
  •   Dewfy    14 年前

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

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