延迟加载的静态集合中的重复项



在我们的 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在添加周围添加一个锁,因此一次只有一个线程可以执行此操作

最新更新