ReadOnlyCollections和Threads - 这段代码安全吗?

Ran*_*der 2 c# locking

我有一个带有ReadOnlyCollection的高度线程化的应用程序,如下所示:

internal static ReadOnlyCollection<DistributorBackpressure44> DistributorBackpressure44Cache
{
    get
    {
        return _distributorBackpressure44;
    }
    set
    {
        _distributorBackpressure44 = value;
    }
}
Run Code Online (Sandbox Code Playgroud)

我在应用程序中有一个地方替换了这个集合(总是在一个单独的线程上),它看起来像这样:

    CicApplication.DistributorBackpressure44Cache = new ReadOnlyCollection<DistributorBackpressure44>(someQueryResults.ToList());
Run Code Online (Sandbox Code Playgroud)

我在代码中有许多地方,通常通过Linq查询,在许多不同的线程中访问此集合.代码通常看起来像这样:

foreach (DistributorBackpressure44 distributorBackpressure44 in CicApplication.DistributorBackpressure44Cache.Where(row => row.Coater == coater && row.CoaterTime >= targetTime).ToList())
{
 ...
 ...
}
Run Code Online (Sandbox Code Playgroud)

我假设我正在做的是线程安全的,不需要做任何锁定?我不确定的是,如果它在同一个集合被替换到另一个线程的同一时间发生,那么上面的查询会发生什么?

Seb*_*raf 5

引用赋值是原子的,所以是的,它是线程安全的.但只要您不依赖于数据就可以在写入数据之后准备好进行读取.这是因为缓存,你可能想投入一个volatile以防止这种情况.

另请参见赋值是原子的,那么为什么需要Interlocked.Exchange(ref Object,Object)?.