Параллелизм при использовании области приложения - PullRequest
2 голосов
/ 18 февраля 2010

В Adobe ColdFusion, если

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

Я обеспокоен тем, что переменная, объявленная в локальной области функции, может иметь проблемы с параллелизмом, поскольку 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?

Ответы [ 3 ]

4 голосов
/ 18 февраля 2010

Чтобы избежать проблем с параллелизмом, создайте экземпляр объекта в методе onapplicatiomstart вашего application.cfc. Это обеспечит создание объекта только один раз. Во-вторых, если переменная «условие» также ограничена локальной областью действия, два вызова не должны мешать друг другу.

2 голосов
/ 19 февраля 2010

Пока все переменные, к которым осуществляется доступ, имеют локальную область видимости (измененную в функции, из которой они вызываются, или аргумент этой функции), проблем с параллелизмом не возникает. Если вы нажмете variables.somevar или this.something (или просто somevar, который не относится к локальной области), вы можете столкнуться с проблемами.

Мы делаем целую серию подобных работ.

1 голос
/ 18 февраля 2010

Да, в вашем коде есть вероятность возникновения гонки.

Вам нужно будет использовать замок вокруг

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

, чтобы предотвратить состояние гонки.

Тип используемой блокировки будет зависеть от того, что делает длинный процесс.

Если вы создаете экземпляр своего фреймворка, вы можете рассмотреть возможность двойной проверки блокировки. (У Джо Райнхарта, автора Model-Glue, было большое сообщение об этом, но его сайт не отвечает.)

Если длительный процесс менее критичен, вы можете использовать более простую блокировку .

...