【发布时间】:2021-10-26 04:28:44
【问题描述】:
someList.Count 线程在 C# 中是安全的吗?
性能对我来说非常重要,由于主程序的复杂性,我不能使用其他线程安全集合
我知道还有很多其他的情况,但只关注这个简单的问题:
someList.Count 是否需要 _lock.EnterReadLock,因为它可能是一个原子属性?
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();
}
}
【问题讨论】:
-
99% 的情况下,您最好只使用
lock而不是ReaderWriterLockSlim。代码编写起来要简单得多,而且更难出错。如果您随后确定存在性能问题,则(并且仅在那时)切换到ReaderWriterLockSlim。 -
告诉我们
someList的用途。你为什么需要它?为什么要加东西呢?它们何时以及为何被移除? -
访问
Count不会破坏数据结构。但是,当然,如果您没有锁定所有它告诉您的是最近,计数是一个特定的数字。它无法让您了解列表now 的状态。这足以满足您的目的吗? -
@Damien_The_Unbeliever 更准确的说法是使用当前实现
You will not corrupt the data structure。文档明确不承诺未来会这样。 -
我们确实就解决了主要(真正的、潜在的)问题。您不需要 any 显式锁定。您每周更新一次。使用我指给你的方法。这就是你所需要的。每周创建一个新列表。
CompareExchange输入。完成。不需要任何其他锁定。
标签: c# multithreading list asp.net-core thread-safety