Stu*_*ler 13 c# concurrency multithreading locking
鉴于以下课程:
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
}
}
}
Run Code Online (Sandbox Code Playgroud)
使用两个锁定对象是正确的,假设MethodOne()并且MethodTwo()可以同时从不同的线程调用并注意到listOne并且listTwo无论如何都不相关.锁中涉及的唯一操作是上面注释中指定的操作.
是的,这是正确的.它避免了因为正在处理其他列表而不必要地锁定一个列表.
这里不需要单独的锁定对象.以下代码也可以正常工作,代码更少,开销更少,错误使用错误锁定的可能性更小:
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
}
}
}
Run Code Online (Sandbox Code Playgroud)