1 public class DictDAL 2 { 3 public readonly static object locker = new object(); 4 5 public static Dictionary<DictTypeEnum, List<DictItem>> Dicts = new Dictionary<DictTypeEnum, List<DictItem>>(); 6 7 public List<DictItem> GetDict(DictTypeEnum dictTypeEnum) 8 { 9 if (Dicts.ContainsKey(dictTypeEnum)) 10 { 11 return Dicts[dictTypeEnum]; 12 } 13 else 14 { 15 lock (locker) 16 { 17 //这句判断是为了防止多线程同时请求同一个字典,当第一个字典从数据库加载后 第二个线程直接获取内容 18 if (Dicts.ContainsKey(dictTypeEnum)) 19 { 20 return Dicts[dictTypeEnum]; 21 } 22 23 //从数据库的字典表加载对应数据 24 List<DictItem> analogList = new List<DictItem>(); 25 analogList.Add(new DictItem() { Text = "名字1", Value = "1" }); 26 analogList.Add(new DictItem() { Text = "名字2", Value = "2" }); 27 28 Dicts.Add(dictTypeEnum, analogList); 29 return analogList; 30 31 } 32 33 } 34 35 } 36 37 } 38 39 public enum DictTypeEnum 40 { 41 验证手段, 42 性别, 43 装载类型, 44 }
思路是想设计一个字典对象,当第一个页面用到某个字典的时候就从数据库加载,然后以后访问的就直接获取内存的对象,不知道上面的设计在多并发的时候是否会有设计缺陷?就是会引发异常情况出现。
BTW:系统是内部业务系统,正常并发在50-100左右
可以使用 ConcurrentDictionary
了解过有这个对象,但是还是担忧在并发同时访问同一个 字典类型 然后就会重复取数据并加载 后加载的肯定要报异常。
所以你说的这个ConcurrentDictionary 只是简单替换我的dictionary吗
能有具体的设计代码思路吗,谢谢~~
ConcurrentDictionary 里面是try update和tryadd