Классический ASP: может ли глобальный объект «Приложение» вызвать мертвую блокировку? - PullRequest
2 голосов
/ 24 ноября 2008

В классический ASP существует глобальный объект с именем "Приложение" , к которому одновременно обращаются все сеансы.

Поскольку объект «Приложение» является общим ресурсом, может ли он вызвать мертвых блокировок?

РЕДАКТИРОВАТЬ: Если нет, то почему для блокировка и разблокировать методы для? Ссылка

Ответы [ 4 ]

5 голосов
/ 24 ноября 2008

тупик отличается от обычного блокировка . Поскольку страницы обрабатываются в разных потоках, если вы не хотите, чтобы другой запрос изменил этот общий ресурс, вы используете Блокировку, а чтобы снова разрешить изменение, вы используете метод Разблокировать. Дело в том, что если вы не используете эти методы, другой запрос может изменить значение элемента в состоянии приложения, в то время как вы полагаетесь на старое значение . Или два запроса могут попытаться изменить его одновременно, и это может вызвать проблемы. Метод блокировки заставляет запрос ждать, пока другой запрос не разблокирует приложение; после этого оно может продолжаться.

Deadlock - это ситуация, в которой поток A блокирует ресурс 1 и ожидает для ресурса 2 для становятся доступными. В то же время поток B , для которого заблокирован ресурс 2 должен получить доступ к ресурсу 1 (который заблокирован потоком ) для продолжения работы и последующего освобождения ресурса. В этой ситуации ни один потоков не может продолжаться (один из них должен быть завершен для продолжения). Это тупик . Application.Lock сам по себе не будет вызывать взаимоблокировки при правильном использовании. Но если он используется неправильно, это может привести к взаимоблокировкам (если они связаны с другим общим ресурсом, который требует блокировки, и о взаимоблокировках не заботятся).

2 голосов
/ 24 ноября 2008

Маловероятно, что блокировка объекта ASP Application приведет к взаимоблокировке, которая длится дольше, чем время ожидания сценария сервера.

Классический объект ASP Application имеет функции блокировки и разблокировки для синхронизации изменений объектов приложения. У вас может быть несколько запросов, пытающихся внести изменения в одно и то же значение - без блокировки, внесение изменения и последующая разблокировка изменения могут быть потеряны.

В качестве простого примера можно привести счетчик некоторых типов. Допустим, ваш код делает:

<%
Application("Count") = Application("Count") + 1
%>

Если у вас есть два одновременных запроса (req1 и req2), вы можете «потерять» попадание на страницу - фактически «пропущенное обновление».

Вы можете предотвратить это, заблокировав переменную Application перед ее обновлением и разблокировав ее после обновления:

<%
Application.Lock
Application("Count") = Application("Count") + 1
Application.Unlock
%>

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

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

Для получения дополнительной информации см. MSDN .

0 голосов
/ 24 ноября 2008

Тупик - это ситуация, когда два или более конкурирующих действия ждут завершения другого, и, следовательно, ни один из них не делает.

0 голосов
/ 24 ноября 2008

Нет, он никогда не блокируется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...