我有一個ReadOnlyCollection一個高度線程化的應用程序如下:ReadOnlyCollections和線程 - 此代碼是否安全?
internal static ReadOnlyCollection<DistributorBackpressure44> DistributorBackpressure44Cache
{
get
{
return _distributorBackpressure44;
}
set
{
_distributorBackpressure44 = value;
}
}
我在此集合被替換(總是在一個單獨的線程)的應用程序一個地方,它看起來像這樣:
CicApplication.DistributorBackpressure44Cache = new ReadOnlyCollection<DistributorBackpressure44>(someQueryResults.ToList());
我有許多地方在代碼中訪問這個集合,通常通過Linq查詢,在許多不同的線程中。代碼通常看起來像這樣:
foreach (DistributorBackpressure44 distributorBackpressure44 in CicApplication.DistributorBackpressure44Cache.Where(row => row.Coater == coater && row.CoaterTime >= targetTime).ToList())
{
...
...
}
我假設我在做什麼是線程安全的,而不需要做任何鎖定?我不確定上面的查詢會發生什麼,如果它發生在集合在不同線程中被替換的同時發生?
我不確定你的意思。但是,如果您的意思是某些數據讀者可能擁有「舊」副本,而某些讀者可能擁有「新副本」,則這是可以接受的。 –
你明白正確,省略了volatile部分。 –