ConcurrentDictionary缓存
class Program { static void Main(string[] args) { for (int i = 0; i < 100; i++) { Thread t = new Thread(Test); t.Start(); } Console.Read(); } static void Test() { var memoize = Memoize<string, string>.MemoizeThreadSafe(GetString); Console.WriteLine(memoize("A")); Thread.Sleep(TimeSpan.FromSeconds(1)); Console.WriteLine(memoize("B")); Thread.Sleep(TimeSpan.FromSeconds(1)); Console.WriteLine(memoize("A")); } public static string GetString(string name) { return $"return data {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")} string {name}"; } } public static class Memoize<T, R> where T : IComparable { private static ConcurrentDictionary<T, R> cache = new ConcurrentDictionary<T, R>(); public static Func<T, R> MemoizeThreadSafe(Func<T, R> func) { return arg => { return cache.GetOrAdd(arg, a => func(arg)); }; } }
1、GetOrAdd不是原子操作,可以用Lazy延迟加载
class Program { static void Main(string[] args) { for (int i = 0; i < 100; i++) { Thread t = new Thread(Test); t.Start(); } Console.Read(); } static void Test() { var memoize = Memoize<string, string>.MemoizeThreadSafe(GetString); Console.WriteLine(memoize("A").Value); Thread.Sleep(TimeSpan.FromSeconds(1)); Console.WriteLine(memoize("B").Value); Thread.Sleep(TimeSpan.FromSeconds(1)); Console.WriteLine(memoize("A").Value); } public static Lazy<string> GetString(string name) { return new Lazy<string>(() => $"return data {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")} string {name}"); } } public static class Memoize<T, R> where T : IComparable { private static ConcurrentDictionary<T, Lazy<R>> cache = new ConcurrentDictionary<T, Lazy<R>>(); public static Func<T, Lazy<R>> MemoizeThreadSafe(Func<T, Lazy<R>> func) { return arg => { return cache.GetOrAdd(arg, a => func(arg)); }; } }

浙公网安备 33010602011771号