1

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

例如

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

1 回答 1

2

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

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

那么这很好 - 它不会引起任何问题,并且您可以在专门“锁定r”时阅读它。(只要确保你lock在任何其他正在使用的代码周围放置一个类似的r。)

但是,如果r正在切换到内部的另一个对象lock

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

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

于 2013-01-23T11:18:21.870 回答