在Adobe ColdFusion中,如果
<cfset Application.obj = CreateObject("component","ComponentName")>
<cfset myResult = Application.obj.FunctionName()>
我担心在函数的本地范围内声明的var可能会出现并发问题,因为Application.obj存储在Application范围内。
<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个人的结果?
答案 0 :(得分:4)
要避免并发问题,请在application.cfc的onapplicatiomstart方法中实例化对象。这将确保只创建一次对象。第二,只要变量“condition”也限定在本地范围内,这两个调用不应互相干扰。
答案 1 :(得分:2)
只要访问的所有变量都是本地作用域的(在调用它们的函数中变量,或者该函数的参数),就没有并发问题。如果您要点击不属于本地范围的variables.somevar
或this.something
(或只是somevar
),那么您可能会遇到问题。
我们做了那种工作的整批。
答案 2 :(得分:1)
是的,您的代码示例中可能存在竞争条件。
你需要使用锁定
<cfset myResult = Application.obj.FunctionName()>
防止比赛状况。
要使用的锁类型实际上取决于漫长过程的作用。
如果要实例化框架,可以考虑使用双重检查锁定。 (Model-Glue的作者Joe Rinehart对此有一个great post,但他的网站没有响应atm。)
如果漫长的过程不那么重要,您可以使用simpler lock。