List<SomeObject>.Count 是否需要 ReaderWriterLockSlim.EnterReadLock?

Is ReaderWriterLockSlim.EnterReadLock necessary for List<SomeObject>.Count?

在 C# 中 someList.Count 线程安全吗?

性能对我来说很重要,由于主程序的复杂性,我不能使用其他线程安全的集合

我知道还有很多其他情况,但只关注这个简单的问题:

_lock.EnterReadLocksomeList.Count 是否必要,因为它可能是一个原子属性?

private ReaderWriterLockSlim _lock;
private List<SomeObject> _someList;

public void Add(SomeObject obj)
{
    try
    {
        _lock.EnterReadLock();
                
        if (_someList.Count < 10)
        {
            try
            {
                _lock.EnterWriteLock();

                _someList.Add(obj);
            }
            finally
            {
                _lock.ExitWriteLock();
            }
        }
    }
    finally
    {
        _lock.ExitReadLock();
    }
}

如果您想确保在读取计数之前完成任何写入操作,则需要读取锁定。假设写锁用于所有写操作。

要在读锁中输入写锁,您必须使用 EnterUpgradeableReadLock 。在读锁中调用 EnterWriteLock 将抛出异常。如果您应该使用写锁或可升级锁,请阅读 。

有关 ReaderWriterLockSlim class 的更多信息,请参阅 https://docs.microsoft.com/en-us/dotnet/api/system.threading.readerwriterlockslim?view=net-5.0

不写_lock.EnterReadLock()也不会例外,但list.Count可能不是预期的数字,所以最好使用_lock.EnterReadLock()我们现在需要确切的 list.Count!