asp.net - HttpApplicationState - 如果线程安全,为什么会存在竞争条件?

标签 asp.net locking state application-state

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

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

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

最佳答案

AcquireRead 和 AcquireWrite 方法位于内部 HttpApplicationStateLock 类中,因此您不必自己使用它们。它们同步访问,但仅限于单个读取或写入。如果需要同步访问,可以在代码中使用 Lock 和 Unlock 方法。

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

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

关于asp.net - HttpApplicationState - 如果线程安全,为什么会存在竞争条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1524922/

相关文章:

javascript - React Context Consumer 不会使用react性改变或重新渲染

asp.net - 在一列或多列中查找独特的单词?

c# - 使用预加载和显式加载查询相关实体在 EF for ASP.NET MVC CORE 中不起作用

c# - Nunit 图形界面

java - 有什么方法可以在java中锁定(同步)二维数组中的一行?

java - 顺序和并行处理

c# - 如何为搜索查询创建解析器

c++ - 如何解锁 boost::upgrade_to_unique_lock(由 boost::shared_mutex 制成)?

javascript - 获取/设置状态对象(vanilla js)

c# - 使用无状态的基本状态机设置