5

jspを学びます。jspのisThreadSafe属性に大きな混乱があります。デフォルトでは、Jspはスレッドセーフではありません。isThreadSafe= true

設定した場合isThreadSafe=false、JSPエンジンは、一度に1つのスレッドのみがJSPを実行していることを確認します。

私は真か偽か混乱しています。isThreadSafe = falseisThreadSafeを使用してjspにアクセスできるのは複数のスレッドのみであることを意味します

isThreadSafeの意味は何ですか

     The isThreadSafe option marks a page as being thread-safe.
 By default, all JSPs are considered thread-safe. If you set the isThreadSafe option to false, the JSP engine makes sure that only one thread at a time is executing your JSP.

        The following page directive sets the isThreadSafe option to false:
    <%@ page isThreadSafe="false"  %>

スレッドセーフとは、複数のスレッドが一度にjspページにアクセスできないことを意味しますか?

4

4 に答える 4

7

この属性は、属性の 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 で共有できます。

于 2013-03-01T10:13:42.413 に答える
1

デフォルトでは、JSPは自動的にスレッドセーフではありません。JSPのサービスセクション内から変更されたインスタンス変数がある場合、それらはすべてのリクエストによって共有され、同時実行の問題が発生します。これはサーブレットでも同じです。サーブレットと同様に、JSPをよりスレッドセーフにするのに役立つはずのメカニズムがあります。これは、JSPページディレクティブで設定できるisThreadSafeプロパティです。この手法は、廃止されたSingleThreadModelインターフェースをサーブレットで実装することに似ています。実際、ほとんどのコンテナーは、生成されたコードにこの非推奨のインターフェースを実装させることにより、スレッドセーフなJSPを実装します。

サーブレットの場合、これは最高のアイデアではないことが判明したため、SingleThreadModelは非推奨になりました。それを使用しても、スレッドセーフではないサーブレットを作成する可能性があるため、これは良い考えではありませんでした。

したがって、要するに、サーブレットで非推奨のSingleThreadModelインターフェースを使用することを避ける必要があるのと同じ理由で、JSPでthreadSafeディレクティブに依存することを避ける必要があります。

スクリプトレットを完全に回避することは、現在受け入れられているベストプラクティスです。スクリプトレットのないJSPにはインスタンス変数がなく、スレッドセーフなJSPを使用するために長い道のりを歩むことになります。

于 2013-03-01T10:14:50.377 に答える
-1

jsp では、ローカル変数を使用すると、常に jsp がスレッド セーフになります。インスタンス変数 jsp を使用していると仮定すると、jsp はスレッド セーフではありません。isThreadSafe を指定する必要があります

于 2013-07-24T13:05:00.950 に答える