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()