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

时间:2016-02-15 13:10:35

标签: asp.net .net vb.net dictionary thread-safety

在我们的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

据我所知,多个线程有可能同时更新字典。但我想,这只会给静态变量赋一个新的字典对象,而且不会有重复。

我的理解是正确还是我错过了什么?

提前致谢!

1 个答案:

答案 0 :(得分:0)

如果您将Dictionary更改为ConcurrentDictionary,则这将是线程安全的。即两个线程可以同时在字典中添加或删除项目:

Public Shared Countries As Concurrent.ConcurrentDictionary(Of String, Country)

好吧,根据定义,字典不能有重复的键,当两个线程在同一时间添加相同的值时会发生什么。答案:未定义 - 要么:

  • 一个会抛出异常或

  • 将添加两个键。

ConcurrentDictionary在添加时添加了一个锁,因此一次只有一个线程可以执行此操作