我希望能够在多个线程上访问List
。这是线程安全的,所以我可以毫无后顾之忧地做到这一点。唯一的问题是偶尔我必须修改List
。所以,我想阻止其他线程仅在被修改时使用List
。
这就是我的想法,有更好的方法吗?
volatile bool isReading = false;
volatile bool isWriting = false;
object o = new object();
public void StartRead()
{
lock (o)
{
while (isWriting || isReading) ;
isReading = true;
}
}
public void StopRead()
{
isReading = false;
}
public void StartWrite()
{
lock (o)
{
while (isReading) ;
isWriting = true;
}
}
public void StopWrite()
{
isWriting = false;
}
答案 0 :(得分:3)
更好的解决方案是使用ReaderWriterLockSlim
。这将允许您同时拥有许多读者,但只有在您有作家时才能锁定它。
http://msdn.microsoft.com/en-us/library/system.threading.readerwriterlockslim.aspx
这实际上取决于锁的争用程度。在低争用情况下,lock
的效果与ReaderWriterLockSlim
- 参考When is ReaderWriterLockSlim better than a simple lock?类似。
这个问题有很多可能的解决方案,具体取决于有关如何使用它的许多细节。但是,在简单化的“面值”案例中,ReaderWriterLockSlim
是一个不错的解决方案。如果在分析性能后它不适合您,则可能需要其他解决方案以适应您的特定使用方案。