HttpApplicationState - Почему существует условие гонки, если оно потокобезопасно? - PullRequest
2 голосов
/ 06 октября 2009

Я только что прочитал статью, в которой описано, как HttpApplicationState имеет AcquireRead() / AcquireWrite() функции для управления одновременным доступом. Он продолжает объяснять, что в некоторых условиях нам нужно использовать экспликт Lock() и Unlock() для объекта Application, чтобы избежать условия Race.

Я не могу понять, почему должно существовать условие гонки для состояния приложения, если объект неявно обрабатывает параллельный доступ.

Может ли кто-нибудь объяснить это мне? Зачем мне когда-либо использовать Application.Lock() и Application.Unlock()? Спасибо!

Ответы [ 2 ]

3 голосов
/ 06 октября 2009

Методы AcquireRead и AcquireWrite находятся во внутреннем классе HttpApplicationStateLock, поэтому вы сами их не используете. Они синхронизируют доступ, но только для одного чтения или записи. Из вашего кода вы используете методы Lock и Unlock, если вам нужно синхронизировать доступ.

Обычно вам необходимо синхронизировать доступ, если вы изменяете что-то, что не является единственным чтением или записью, например, добавление двух элементов приложения, которые зависят друг от друга, или сначала проверка, существует ли элемент, а затем добавление:

Application.Lock()
if (Application["info"] == null) {
   Application.Add("info", FetchInfoFromDatabase());
}
Application.Unlock();
1 голос
/ 06 октября 2009

HttpApplicationState - где глобальные переменные доступа видны всем

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

значение переменных. Нам нужны некоторые меры предосторожности, поэтому мы используем

Application.Lock () и после выполнения задания освобождает ту же переменную другим в

очередь с использованием Application.Unlock ()

Application.Lock()
Application("VisitorCount") = Convert.ToInt32(Application("VisitorCount")) + 1
Application.UnLock()
...