我有一个多线程运行上下文。我希望一个资源(比如说对象 r)是互斥的。我可以将资源本身用作其监控对象吗?
例如
lock(r)
{
// do something...
}
我有一个多线程运行上下文。我希望一个资源(比如说对象 r)是互斥的。我可以将资源本身用作其监控对象吗?
例如
lock(r)
{
// do something...
}
如果始终保持相同的r对象 - 例如,您要从多个线程中添加项目:rList
lock (r)
{
r.Add("Hello world");
}
那么这很好 - 它不会引起任何问题,并且您可以在专门“锁定r”时阅读它。(只要确保你lock在任何其他正在使用的代码周围放置一个类似的r。)
但是,如果r正在切换到内部的另一个对象lock:
lock (r)
{
r = new List<string>();
}
这不是一个好主意,因为您最终可能会有两个线程lock针对两个不同版本的r. 在这种情况下,您应该创建一个object专门用于锁定的不变 - 您更多的是“锁定代码块”而不是“锁定r”。