この属性は、属性の true 値を指定した場合、JSP コンテナーから JSP ページに複数の同時要求を送信するためのスレッドを維持する機能をサポートします。それ以外の場合、属性の false 値を指定した場合、JSP コンテナーは 1 つの要求のみを送信できます。一度に。属性のデフォルト値は true です。
スレッドセーフな JSP/サーブレットは、複数のスレッドが同時に実行されている場合に正しく機能するものです。JSP をスレッドセーフにするために、 2 つのスレッドが同時にサービス メソッドSingleThreadModel
にアクセスするのを防ぐインターフェースを実装できます。
デフォルトでは、サーブレット コンテナは、JSP ページ コードが複数の要求スレッドによって単一のインスタンスで再利用されても安全であると見なします。ページのコードが意図せずに同時リクエスト間でその状態を共有する危険がある場合、次のディレクティブにより、サーブレット コンテナは各リクエストでページの個別のインスタンスを使用します。
<%@ page isThreadSafe="false" %>
これにより、JSP ページ用に生成されたサーブレットの 1 つのインスタンスがメモリにロードされる代わりに、サーブレットのN 個のインスタンスがロードおよび初期化され、各インスタンスのサービス メソッドが効果的に同期されます。通常、SingleThreadModel を実装するすべてのサーブレットに対してインスタンス化されるインスタンスの数 (N) は、JSP エンジンの管理画面から制御できます。
JSP がスレッドセーフかどうかは、JSP の実装方法の結果です。JSP のコードが状態 (メンバー変数やセッション変数など) を保持しない場合、サーブレット コンテナーは "isThreadSafe" 属性のデフォルトの "true" 値に依存して、応答を高速化し、メモリ フットプリントを小さくすることができます。
たとえば、たまたま を使用した場合<%! %>
、コードは _jspService メソッドではなくクラス レベルに配置されます。クラス メンバを JSP に導入すると、単一インスタンスの使用でスレッド セーフが失われる可能性があります。
JSP が並列リクエストを処理する単一のインスタンスとしてスレッド セーフでない場合は、isThreadSafe=false
正常に機能させるために を追加する必要があります。これにより、サーブレット コンテナに JSP のスレッドの安全性を回避するように指示することで、Web アプリケーションのスレッドの安全性が維持されますが、次のコストがかかります。
isThreadSafe=true の場合、JSP コンテナーは、複数の未処理のクライアント要求をページに同時にディスパッチすることを選択できます。true を使用するページ作成者は、ページの共有状態へのアクセスを適切に同期する必要があります。
isThreadSafe=false の場合、JSP コンテナーは、複数の未処理のクライアント要求を、受信した順序で一度に 1 つずつ、処理のためにページ実装にディスパッチします。
属性が false の場合でもisThreadSafe
、JSP ページの作成者は、共有オブジェクトへのアクセスが適切に同期されていることを確認する必要があることに注意してください。オブジェクトは、ServletContext または HttpSession で共有できます。