并发线程安全列表访问和修改

本文关键字:修改 访问 列表 线程 安全 并发 | 更新日期: 2023-09-27 18:20:59

我希望能够在多个线程上访问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;
}

并发线程安全列表访问和修改

更好的解决方案是使用ReaderWriterLockSlim。这会让你同时拥有许多读者,但只有当你有一个作家时才会锁定它。

http://msdn.microsoft.com/en-us/library/system.threading.readerwriterlockslim.aspx

不过,这实际上取决于锁的争用程度。在低争用情况下,lock的性能将类似于ReaderWriterLockSlim-引用ReaderWriterLockSlim何时比简单锁更好?。

这个问题有很多可能的解决方案,具体取决于它是如何使用的。但是,在简单的"从表面上看"的情况下,ReaderWriterLockSlim是一个不错的解决方案。如果在分析性能后它对您不起作用,那么可能需要其他解决方案来适应您的特定使用场景。