在我们的asp.net应用程序中,我们懒得将几个经常使用的数据(例如国家)从db加载到静态字典。问题是,字典偶尔会有两个国家的副本。
VB代码的主要部分如下。
Private Shared MyCountries As Dictionary(Of String, Country)
Shared Function Countries() As Dictionary(Of String, Country)
If IsNothing(MyCountries) Then
MyCountries = (From o In (New MyAppDBContext()).Countries Order By o.CountryCode Ascending).ToDictionary(Function(value As Country) value.CountryCode)
End If
Return MyCountries
End Function
据我所知,多个线程有可能同时更新字典。但我想,这只会给静态变量赋一个新的字典对象,而且不会有重复。
我的理解是正确还是我错过了什么?
提前致谢!
答案 0 :(得分:0)
如果您将Dictionary
更改为ConcurrentDictionary
,则这将是线程安全的。即两个线程可以同时在字典中添加或删除项目:
Public Shared Countries As Concurrent.ConcurrentDictionary(Of String, Country)
好吧,根据定义,字典不能有重复的键,但当两个线程在同一时间添加相同的值时会发生什么。答案:未定义 - 要么:
一个会抛出异常或
将添加两个键。
ConcurrentDictionary
在添加时添加了一个锁,因此一次只有一个线程可以执行此操作