HttpApplicationState - 如果线程安全,为什么Race条件存在?

时间:2009-10-06 11:00:27

标签: asp.net locking state application-state

我刚读了一篇文章,描述了HttpApplicationState如何使用AcquireRead() / AcquireWrite()函数来管理并发访问。它继续解释,在某些情况下,我们需要在Application对象上使用explict Lock()Unlock()来避免Race条件。

如果对象隐式处理并发访问,我无法理解为什么应用程序状态应该存在竞争条件。

有人可以向我解释一下吗?为什么我需要使用Application.Lock()Application.Unlock()?谢谢!

2 个答案:

答案 0 :(得分:3)

AcquireRead和AcquireWrite方法位于内部HttpApplicationStateLock类中,因此您不必自己使用它们。它们同步访问,但仅适用于单个读取或写入。如果需要同步访问,请从代码中使用“锁定”和“解锁”方法。

如果要更改不是单个读取或写入的内容,通常需要同步访问权限,例如添加两个相互依赖的应用程序项,或首先检查项目是否存在然后添加它:

Application.Lock()
if (Application["info"] == null) {
   Application.Add("info", FetchInfoFromDatabase());
}
Application.Unlock();

答案 1 :(得分:1)

HttpApplicationState - 全局访问变量,其中所有

都可见

正在使用该应用程序的用户。所以为了在改变时避免竞争条件

变量的值。我们需要一些预防措施,这就是我们使用

的原因

Application.Lock()并在完成作业后将相同的变量释放给

中的其他变量

队列使用Application.Unlock()

Application.Lock()
Application("VisitorCount") = Convert.ToInt32(Application("VisitorCount")) + 1
Application.UnLock()