Классический ASP: может ли глобальный объект приложения вызвать мертвую блокировку?

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

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

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


person Daniel Silveira    schedule 24.11.2008    source источник


Ответы (4)


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

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

person mmx    schedule 24.11.2008

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

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

В качестве простого примера может быть какой-то счетчик. Скажем, ваш код:

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

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

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

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

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

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

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

person dariom    schedule 24.11.2008

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

person Stefan Mai    schedule 24.11.2008

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

person MysticSlayer    schedule 24.11.2008