Concurrency 应用程序对象和并发关注点

Concurrency 应用程序对象和并发关注点,concurrency,asp-classic,locking,Concurrency,Asp Classic,Locking,在一些asp教程中,例如,我观察到以下模式: 应用程序。锁 '对应用程序对象执行一些操作 应用程序。解锁 但是,由于网页可以有多个实例,因此存在明显的并发问题。因此,我的问题如下: 如果一个页面试图在对象已锁定的情况下锁定怎么办 是否有方法检测应用程序对象是否已锁定 只处理一个未锁定的应用程序对象是更好还是会产生其他后果 如果只有一个操作涉及应用程序对象,该怎么办~在这种情况下是否有锁定/解锁的理由?如果一个页面试图在应用程序对象已锁定的情况下锁定该对象,它将等待持有该锁定的页面将其释放。这通常

在一些asp教程中,例如,我观察到以下模式:

应用程序。锁

'对应用程序对象执行一些操作

应用程序。解锁

但是,由于网页可以有多个实例,因此存在明显的并发问题。因此,我的问题如下:

如果一个页面试图在对象已锁定的情况下锁定怎么办

是否有方法检测应用程序对象是否已锁定

只处理一个未锁定的应用程序对象是更好还是会产生其他后果


如果只有一个操作涉及应用程序对象,该怎么办~在这种情况下是否有锁定/解锁的理由?

如果一个页面试图在应用程序对象已锁定的情况下锁定该对象,它将等待持有该锁定的页面将其释放。这通常会很快(ASP代码通常只应将锁保持足够长的时间,以访问存储在应用程序中的共享对象)。

如果使用未锁定的应用程序对象,则会产生后果。例如,如果要实现全局计数器:-

Application("myCounter") = Application("myCounter") + 1
上述代码有时会计算错误。此代码读取、添加和分配。如果两个线程试图同时执行此操作,它们可能会读取相同的值,然后写入相同的值,并将myCounter的值增加1而不是2

需要做的是确保在第二个线程写入myCounter之前,第二个线程无法读取myCounter。因此,这是更好的:-

Application.Lock

Application("myCounter") = Application("myCounter") + 1

Application.Unlock
当然,如果长时间持有锁,会出现并发问题,特别是当应用程序的其他用途不受持有锁的代码的影响时

因此,您应该避免需要长时间锁定应用程序的设计。

来自:

Lock
方法阻止其他客户端修改存储在应用程序对象中的变量,确保每次只有一个客户端可以修改或访问应用程序变量

如果不显式调用
应用程序.Unlock
方法,则当.asp文件结束或超时时,服务器将解锁锁定的应用程序对象

应用程序对象上的锁定会持续很短的时间,因为当页面完成处理或超时时,应用程序对象将被解锁

如果一个页面锁定了应用程序对象,而第二个页面在第一个页面仍被锁定时尝试执行相同操作,则第二个页面将等待第一个页面完成,或者直到达到
服务器.ScriptTimeout
限制

例如:

<%@ Language="VBScript" %> 
<% 
   Application.Lock  
   Application("PageCalls") = Application("PageCalls") + 1  
   Application("LastCall") = Now()  
   Application.Unlock  
%>  

This page has been called <%= Application("PageCalls") %> times.

这一页被称为时代。

在上面的示例中,
Lock
方法一次阻止多个客户端访问变量PageCalls。如果应用程序未被锁定,则两个客户端可以同时尝试递增变量PageCalls

这是一个复制和粘贴从-没有适当的信用。