ReaderWriterLockSlim.EnterReadLock 对于列表是否必要<SomeObject>。计数?



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

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

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

_lock.EnterReadLock对于someList.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会抛出异常。如果您应该使用写锁或可升级锁,请阅读https://stackoverflow.com/a/26578074/9271844。

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

如果不写入_lock.EnterReadLock(),而是写入列表,则不会出现异常。Count可能不是预期的数字,所以如果我们需要确切的列表,最好使用_lock.EnterReadLock()。现在就数!

相关内容