Coldfusion 使用应用程序作用域时的并发性

Coldfusion 使用应用程序作用域时的并发性,coldfusion,Coldfusion,在Adobe ColdFusion中,如果 <cfset Application.obj = CreateObject("component","ComponentName")> <cfset myResult = Application.obj.FunctionName()> 我担心在函数的本地作用域中声明的var可能存在并发问题,因为Application.obj存储在应用程序作用域中 <cffunction name="FunctionName">

在Adobe ColdFusion中,如果

<cfset Application.obj = CreateObject("component","ComponentName")>
<cfset myResult = Application.obj.FunctionName()>

我担心在函数的本地作用域中声明的var可能存在并发问题,因为Application.obj存储在应用程序作用域中

<cffunction name="FunctionName">
<cfset var local = {}>
(pretend some long process happens here)
<cfif condition>
   <cfset local.result = True>
<cfelse>
   <cfset local.result = False>
</cfif>
<cfreturn local.result>

(假设这里发生了一个漫长的过程)

如果两个人同时在该函数中,则第1个人的结果是否会损坏第2个人的结果?

是的,您的代码示例中可能存在竞争条件

你需要在周围使用一把锁

<cfset myResult = Application.obj.FunctionName()> 

以防止出现竞争状况

要使用的锁的类型实际上取决于长进程正在做什么

如果你正在实例化你的框架,你可能会考虑双重检查锁定。(模型胶的作者乔·里内哈特对此有点怀疑,但他的网站没有回应。)


如果长流程不那么关键,您可以使用。

来避免并发问题,请在application.cfc的onApplicationStart方法中实例化该对象。这将确保只创建一次对象。其次,只要变量“condition”的作用域也是局部作用域,这两个调用就不应该相互干扰。

只要所访问的所有变量都是局部作用域(在调用它们的函数中的变量或该函数的参数),就不存在并发问题。如果您点击的是
variables.somevar
this.something
(或只是
somevar
,不属于本地范围),那么您可能会开始遇到问题

我们做了很多类似的工作

如果它在var作用域(即函数本地作用域)中,那么您将没有竞争条件,并且不需要锁定函数调用