従来のASPには、すべてのセッションから同時にアクセスされる「アプリケーション」と呼ばれるグローバル オブジェクトがあります。
「アプリケーション」オブジェクトは共有リソースであるため、デッドロックを引き起こす可能性はありますか?
編集:そうでない場合、なぜロックとロック解除の方法があるのですか? 参照
従来のASPには、すべてのセッションから同時にアクセスされる「アプリケーション」と呼ばれるグローバル オブジェクトがあります。
「アプリケーション」オブジェクトは共有リソースであるため、デッドロックを引き起こす可能性はありますか?
編集:そうでない場合、なぜロックとロック解除の方法があるのですか? 参照
デッドロックは、通常のブロッキングとは異なります。ページは異なるスレッドで処理されるため、別のリクエストがその共有リソースを変更できないようにする場合は Lock を使用し、再度変更を許可するには Unlock メソッドを使用します。問題は、これらのメソッドを使用しない場合、古い値に依存している間に、別のリクエストがアプリケーション状態のアイテムの値を変更する可能性があることです。または、2 つの要求が同時に変更を試み、問題が発生する可能性があります。Lock メソッドは、別のリクエストがアプリケーションのロックを解除するまでリクエストを待機させます。その後、それは続けることができます。
デッドロックとは、スレッド Aが リソース 1をロック し、リソース 2が使用可能になるまで待機する状況です。同時に、リソース 2をロックしているスレッド Bは、リソース 1 (スレッド Aによってロックされている)にアクセスして、作業を続行し、後でリソースを解放できるようにする必要があります。この状況では、どのスレッドも続行できません (続行できるようにするには、いずれかのスレッドを終了する必要があります)。これはデッドロックです . Application.Lock が正しく使用されていれば、単独でデッドロックが発生することはありません。ただし、正しく使用しないと、デッドロックが発生する可能性があります (ロックが必要な別の共有リソースと結合し、デッドロックが処理されない場合)。
ASPApplication
オブジェクトをロックしても、デッドロックがサーバー スクリプトのタイムアウト設定より長く続くことはほとんどありません。
従来の ASPApplication
オブジェクトには、アプリケーション オブジェクトへの変更を同期するためのロックとロック解除があります。複数のリクエストで同じ値を変更しようとする可能性があります。ロックせずに、変更を行ってから変更をロック解除すると、失われる可能性があります。
簡単な例として、ある種のカウンターがあります。あなたのコードがそうしているとしましょう:
<%
Application("Count") = Application("Count") + 1
%>
2 つの同時リクエスト (req1 と req2) がある場合、ページ ヒットを「失う」可能性があります。事実上、「更新の欠落」です。
これを防ぐには、Application
変数を更新する前にロックし、更新後にロックを解除します。
<%
Application.Lock
Application("Count") = Application("Count") + 1
Application.Unlock
%>
別の要求スレッドがアクセスしようとしている間に がロックされている場合Application
、ロックが解除されるか、スクリプトのタイムアウトを超えるまで、スレッドはブロックされます。
ロックを解除するのを忘れた場合、ページが処理された後、またはスクリプトのタイムアウトを超えた後に、ロックは自動的に解放されます。
詳細については、MSDN を参照してください。
いいえ、ブロックすることはありません。
デッドロックとは、競合する 2 つ以上のアクションが他のアクションの終了を待っている状況であり、どちらも終了することはありません。