我可以使用资源本身作为监视器来锁定资源吗?

时间:2013-01-23 10:31:55

标签: c# multithreading locking mutual-exclusion

我有一个多线程运行上下文。我想要一个资源(比如说对象r)是互斥的。我可以将资源本身用作其监视对象吗?

e.g。

    lock(r)
    {
        // do something...
    }

1 个答案:

答案 0 :(得分:2)

如果r始终保持相同的对象 - 例如,rList,您要从多个线程添加项目:

lock (r)
{
    r.Add("Hello world");
}

然后这很好 - 它不会导致任何问题,你可以阅读它,因为你是专门“锁定r”。 (只需确保在使用lock的任何其他代码周围添加类似的r。)

但是,如果正在为r内的其他对象切换lock

lock (r)
{
    r = new List<string>();
}

这个不是一个好主意,因为最终会有两个线程针对两个不同版本的lock运行r。在这种情况下,您应该专门创建一个不变的object来锁定 - 您更多地“锁定代码块”而不是“锁定r”。