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