我有一个带有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)
我假设我正在做的是线程安全的,不需要做任何锁定?我不确定的是,如果它在同一个集合被替换到另一个线程的同一时间发生,那么上面的查询会发生什么?
引用赋值是原子的,所以是的,它是线程安全的.但只要您不依赖于数据就可以在写入数据之后准备好进行读取.这是因为缓存,你可能想投入一个volatile以防止这种情况.
另请参见赋值是原子的,那么为什么需要Interlocked.Exchange(ref Object,Object)?.
| 归档时间: |
|
| 查看次数: |
90 次 |
| 最近记录: |