在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()。现在就数!