c# – 可以(应该?)懒惰用作缓存技术?
发布时间:2020-12-15 07:58:43 所属栏目:百科 来源:网络整理
导读:我想使用.NET的Lazy T用于实现线程安全缓存的类.假设我们有以下设置: class Foo{ Lazystring cachedAttribute; Foo() { invalidateCache(); } string initCache() { string returnVal = ""; //CALCULATE RETURNVAL HERE return returnVal; } public String
我想使用.NET的Lazy< T>用于实现线程安全缓存的类.假设我们有以下设置:
class Foo { Lazy<string> cachedAttribute; Foo() { invalidateCache(); } string initCache() { string returnVal = ""; //CALCULATE RETURNVAL HERE return returnVal; } public String CachedAttr { get { return cachedAttribute.Value; } } void invalidateCache() { cachedAttribute = new Lazy<string>(initCache,true); } } 我的问题是: >这会起作用吗? 我觉得我在invalidateCache附近的某个地方错过了一个锁,但对于我的生活,我无法弄清楚它是什么. 我确定这个地方有问题,我只是没弄明白. [编辑] 好吧,看起来我是对的,有些东西我没想过.如果一个线程看到一个过时的缓存,那将是一件非常糟糕的事情,所以看起来“懒惰”不够安全.虽然该属性被访问了很多,所以我正在进行预成熟优化,希望我能学到一些东西,并且有一个模式可以在将来用于线程安全缓存.我会继续努力. P.S.:我决定使对象线程不安全,并且可以小心地控制对象的访问权限. 解决方法
好吧,它不是线程安全的,因为一个线程在失效后另一个线程看到新值后仍然可以看到旧值 – 因为第一个线程可能没有看到对cachedAttribute的更改.从理论上讲,这种情况可能会永远存在,尽管它不太可能:)
使用Lazy< T>作为一个不变的价值观的缓存似乎对我来说是一个更好的主意 – 更符合它的预期 – 但如果你能够应对在另一个线程中任意长时间使用旧的“无效”值的可能性,我认为这没关系. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |