2

经典 ASP中,有一个名为“应用程序”的全局对象,所有会话都可以同时访问它。

由于“应用程序”对象是共享资源,它会导致死锁吗?

编辑:如果没有,为什么它有锁定解锁方法?参考

4

4 回答 4

5

死锁不同于普通的阻塞。由于页面是在不同的线程中处理的,如果您想阻止另一个请求修改该共享资源,请使用 Lock,并允许再次修改,您使用 Unlock 方法。问题是,如果您不使用这些方法,另一个请求可以更改应用程序状态中项目的值,而您依赖的是旧值。或者两个请求可以尝试同时修改它,这可能会导致问题。Lock 方法导致一个请求等待,直到另一个请求解锁应用程序;之后,它可以继续。

死锁是线程 A 锁定 资源 1等待资源 2可用的情况。同时线程 B已经锁定了 资源 2需要访问资源 1(被线程 A锁定)才能继续工作并能够在之后释放资源。在这种情况下,没有一个线程可以继续(其中一个必须终止以允许继续)。这是一个僵局. 如果正确使用,Application.Lock 本身不会导致死锁。但是如果使用不正确,可能会导致死锁(当与另一个需要锁定的共享资源结合使用时,死锁不会得到处理)。

于 2008-11-24T12:32:50.207 回答
2

锁定 ASP 对象不太可能Application导致死锁持续时间超过服务器脚本超时设置。

经典的 ASPApplication对象具有 Lock 和 Unlock 用于同步对 Application 对象的更改。您可以有多个请求尝试更改相同的值 - 没有锁定,进行更改然后解锁更改可能会丢失。

简单的例子是某种计数器。假设您的代码可以:

<%
Application("Count") = Application("Count") + 1
%>

如果您有两个同时请求(req1 和 req2),您可能会“丢失”页面点击 - 实际上是“丢失更新”。

Application您可以通过在更新之前锁定变量并在更新后解锁它来防止这种情况:

<%
Application.Lock
Application("Count") = Application("Count") + 1
Application.Unlock
%>

如果Application在另一个请求线程尝试访问它时被锁定,则该线程将阻塞,直到锁定被释放或超过脚本超时。

如果您忘记解锁一个锁,它将在页面处理完或超过脚本超时后自动释放。

有关详细信息,请参阅 MSDN

于 2008-11-24T16:03:49.470 回答
0

不,它永远不会阻塞。

于 2008-11-24T12:07:02.223 回答
0

死锁是一种情况,其中两个或多个竞争动作正在等待另一个完成,因此永远不会。

于 2008-11-24T12:08:48.477 回答