在我们的 asp.net 应用程序中,我们懒惰地将一些常用数据(例如国家(从数据库加载到静态字典。问题是,有时字典中每个国家都有两份。
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
我知道多个线程有机会同时更新字典。但我认为,这只会为静态变量分配一个新的字典对象,并且不会有重复项。
我的理解是正确的还是我错过了什么?
提前感谢!
如果您将Dictionary
更改为 ConcurrentDictionary
,这将是线程安全的。 即两个线程可以同时在字典中添加或删除项目:
Public Shared Countries As Concurrent.ConcurrentDictionary(Of String, Country)
好吧,根据定义,字典不能有重复的键,但是当两个线程在完全相同的时间添加相同的值时会发生什么。答案:未定义 - 以下任一:
一个会抛出异常或
将添加两个键。
ConcurrentDictionary
在添加周围添加一个锁,因此一次只有一个线程可以执行此操作