// autoLock 防止Cache失效的时候,大量请求Cache对象,重复调用Load使得服务器彻底失效 public static T GetOrDefault <T>(string key, Func <T> loadFunc, int lifeTimeSeconds = CahceTimeDefault, bool autoLock = true) where T : class { T obj = cacheProvider.GetCachedObject(key) as T; if (null == obj) { if (autoLock) { using (var l = cacheProvider.AcquireLock(key)) { // re read,多线程环境下,如果第一次读取失败 // 每个线程都会call load Func,所以会引起内存失效崩溃 // 现在的代码只会有一个线程call对应的loadFunc obj = cacheProvider.GetCachedObject(key) as T; if (null != obj) { return(obj); } obj = loadFunc(); cacheProvider.SetCachedObject(key, obj, lifeTimeSeconds); } } else { obj = loadFunc(); cacheProvider.SetCachedObject(key, obj, lifeTimeSeconds); } } return(obj); }