【发布时间】:2013-02-11 14:13:35
【问题描述】:
给定以下类:
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 无论如何都不相关。锁涉及的唯一操作是上面的 cmets 中指定的操作。
【问题讨论】:
-
这称为锁拆分,如果两个对象和方法是独立的,这是减少争用的好方法。
-
这应该叫常识,反其道而行之是非常不好的做法。
-
您可能想要查看的一件事是使用ReaderWriterLock。如果您只从列表中读取它允许多个线程一次使用它(
List具有线程安全读取),一旦您需要写入,您升级锁,然后只有一个线程可以写入并且所有读取器都被阻止,之后多个阅读器可以重新开始。
标签: c# multithreading concurrency locking