HttpApplicationState - Почему существует условие гонки, если оно потокобезопасно?

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

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

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

2 ответа

Решение

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

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

Application.Lock()
if (Application["info"] == null) {
   Application.Add("info", FetchInfoFromDatabase());
}
Application.Unlock();

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

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

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

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

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

Application.Lock()
Application("VisitorCount") = Convert.ToInt32(Application("VisitorCount")) + 1
Application.UnLock()
Другие вопросы по тегам