我有一个多线程运行上下文。我想要一个资源(比如说对象r)是互斥的。我可以将资源本身用作其监视对象吗?
e.g。
lock(r)
{
// do something...
}
答案 0 :(得分:2)
如果r
始终保持相同的对象 - 例如,r
是List
,您要从多个线程添加项目:
lock (r)
{
r.Add("Hello world");
}
然后这很好 - 它不会导致任何问题,你可以阅读它,因为你是专门“锁定r
”。 (只需确保在使用lock
的任何其他代码周围添加类似的r
。)
但是,如果正在为r
内的其他对象切换lock
:
lock (r)
{
r = new List<string>();
}
这个不是一个好主意,因为最终会有两个线程针对两个不同版本的lock
运行r
。在这种情况下,您应该专门创建一个不变的object
来锁定 - 您更多地“锁定代码块”而不是“锁定r
”。