在经典ASP 中,有一个名为“Application”的全局对象,所有会话都可以同时访问。
由于“Application”对象是共享资源,是否会导致死锁?
编辑:如果没有,为什么它有锁定和解锁方法? Reference
答案 0 :(得分:5)
死锁与普通阻止不同。由于页面是在不同的线程中处理的,如果要阻止其他请求修改该共享资源,则使用Lock,并允许再次修改,使用Unlock方法。问题是,如果您不使用这些方法,另一个请求可以更改应用程序状态中项目的值,而您依赖的是旧值。或者两个请求可以尝试同时修改它,这可能会导致问题。 Lock方法导致请求等待,直到另一个请求解锁应用程序;之后,它可以继续。
死锁是线程A 锁定 资源1 并且等待 资源2的情况成为可用的。同时线程B ,其中已锁定 资源2 需要访问资源1 (由此锁定线程A )继续工作并能够在之后释放资源。在这种情况下,线程的无可以继续(其中一个必须终止以允许继续)。这是一个死锁。如果正确使用,Application.Lock本身不会导致死锁。但如果它没有正确使用,它可能会导致死锁(当与另一个需要锁定和死锁的共享资源结合使用时)。
答案 1 :(得分:2)
锁定ASP Application
对象不太可能导致死锁持续时间超过服务器脚本超时设置。
经典ASP Application
对象具有锁定和解锁功能,用于同步对Application对象的更改。您可以有多个请求尝试更改相同的值 - 无需锁定,进行更改然后解锁更改可能会丢失。
简单的例子就是某些种类的反击。假设你的代码确实如此:
<%
Application("Count") = Application("Count") + 1
%>
如果你有两个同步请求(req1和req2),你可能会“丢失”一个页面命中 - 实际上是“缺少更新”。
您可以通过在更新前锁定Application
变量并在更新后将其解锁来阻止此操作:
<%
Application.Lock
Application("Count") = Application("Count") + 1
Application.Unlock
%>
如果Application
被锁定而另一个请求线程试图访问它,则该线程将阻塞,直到锁被释放或超出脚本超时。
如果您忘记解锁,它将在处理页面后或超出脚本超时后自动释放。
有关详细信息,请see MSDN。
答案 2 :(得分:0)
不,它从不阻止。
答案 3 :(得分:0)
死锁是指两个或多个竞争行为正在等待另一个完成的情况,因此两者都没有。