鉴于以下课程:
class x
{
Object lockOne = new Object();
Object lockTwo = new Object();
List<Something> listOne = new List<Something>();
List<Something> listTwo = new List<Something>();
void MethodOne()
{
lock(lockOne)
{
// some operation on listOne
}
}
void MethodTwo()
{
lock(lockTwo)
{
// some operation on listTwo
}
}
}
使用两个锁定对象是否正确,假设可以同时从不同的线程调用MethodOne()
和MethodTwo()
,并指出listOne
和listTwo
无关。锁中涉及的唯一操作是上面注释中指定的操作。
答案 0 :(得分:8)
是的,这是正确的。它避免了因为正在处理其他列表而不必要地锁定一个列表。
答案 1 :(得分:8)
这里不需要单独的锁定对象。以下代码也可以正常工作,代码更少,开销更少,错误使用错误锁定的可能性更小:
class x
{
List<Something> listOne = new List<Something>();
List<Something> listTwo = new List<Something>();
void MethodOne()
{
lock (listOne)
{
// some operation on listOne
}
}
void MethodTwo()
{
lock (listTwo)
{
// some operation on listTwo
}
}
}