List<SomeObject>.Count 是否需要 ReaderWriterLockSlim.EnterReadLock?
Is ReaderWriterLockSlim.EnterReadLock necessary for List<SomeObject>.Count?
在 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
将抛出异常。如果您应该使用写锁或可升级锁,请阅读 。
有关 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!
在 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
将抛出异常。如果您应该使用写锁或可升级锁,请阅读 。
有关 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!