在过去,我在访问HttpRuntime.Cache机制时设置了一个锁。我不确定我是否真的研究过这个问题,盲人用锁把它包围起来。
你认为这真的有必要吗?
发布于 2010-02-25 08:07:40
本文建议使用锁:
http://msdn.microsoft.com/en-us/magazine/cc500561.aspx
引用:
问题是,如果您有一个耗时30秒的查询,并且您每秒都在执行页面,则在填充缓存项所用的时间内,将有29个其他请求进入,所有这些请求都会尝试使用它们自己对数据库的查询来填充缓存项。要解决此问题,您可以添加一个线程锁,以阻止其他页面执行从数据库请求数据。
下面是他们的代码片段:
// check for cached results
object cachedResults = ctx.Cache["PersonList"];
ArrayList results = new ArrayList();
if (cachedResults == null)
{
// lock this section of the code
// while we populate the list
lock(lockObject)
{
cachedResults = ctx.Cache["PersonList"];
// only populate if list was not populated by
// another thread while this thread was waiting
if (cachedResults == null)
{
cachedResults = ...
ctx.Cache["PersonList"] = cachedResults;
}
}
}我还没有测试过这段代码,但如果有人在生产环境中评估过这种方法,我会非常感兴趣。
发布于 2009-04-16 08:19:24
根据该文档,对缓存对象的http://msdn.microsoft.com/en-us/library/system.web.caching.cache(VS.80).aspx访问是线程安全的。至于你存储在缓存中的对象,线程的安全性必须来自其他地方。
发布于 2009-04-16 08:32:39
我认为没有必要用锁包装对HttpRuntime.Cache属性的访问,因为.Cache属性是静态的,也是线程安全的。
访问缓存对象有许多不同的方法(HttpRuntime.Cache、HttpContext.Current.Cache、Page.Cache等)。它们都访问相同的Cache对象,因为每个应用程序域只有一个Cache对象,因为它实际上是线程安全的Singleton对象。
https://stackoverflow.com/questions/754661
复制相似问题