0

サーバー側のコーディングと JSP/サーブレットは初めてです。私は3つのクラスを持つコードを持っています。1 つ目は、Java httpservlet から継承された Serv クラスです。これには doPost() メソッドが実装されています。doPost() では、2 番目のクラス ResourceClass のオブジェクトを使用します。ResourceClass はシングルトン クラスです。したがって、基本的に任意のメソッドを使用するには、ResourceClass.getInstance().readResource(); のようなことを行います。現在、readResource はさらに Java ネイティブ アクセス ライブラリを使用して、ディスクからリソースを読み取ります。今私の質問は、新しいリクエストごとに1000台のクライアントがサーバー(Apache Tomcat)に接続する場合、リクエストを処理する新しいサーブレットがあることを理解しているからです。ただし、これらのサーブレットはすべて、基本的に同じシングルトン オブジェクトを使用します。したがって、この読み取りはスレッドセーフになります。

内部状態は変更しません。だから私はそれが私の出力に影響を与えないと思うので、全体がべき等です。しかし、これらのリクエストはすべてキューに入れられ、シングルトン クラス オブジェクトがボトルネックになります。または、各サーブレットには独自のコピーがあります。

また、リソースの状態を変更すると、その場合はスレッドセーフになります。

4

2 に答える 2

0

Java EEサーバーでは、各サーブレットのインスタンスは1つだけです。一方、各httpリクエストは、サーバーによって独自のスレッドで処理されます。

ResourceClassシングルトンであるため、readResource()メソッドが同期されている場合にボトルネックが発生するというインスタンスが1つあります。

于 2012-05-03T07:44:20.327 に答える
0

まず、リクエストごとに新しいサーブレットが作成されるわけではありません。すべてのリクエストを同時に処理するために、サーブレットの同じ一意のインスタンスが使用されます。サーブレットもシングルトンです。Web コンテナーは 1 つのインスタンスのみをインスタンス化します。

ResourceClass シングルトンへのリクエストはキューに入れられると言います。メソッドをとしてマークsynchronizedするか、他のロックメカニズムを使用しない限り、それらはしません。そうしないと、スレッドはシングルトン メソッドを同時に呼び出します。

スレッドセーフかどうかは、シングルトンのコードと JNI ライブラリのコードを見ないとわかりません。読み取り専用であるという事実は、スレッドセーフである可能性があることを示していますが、保証されていません.

于 2012-05-03T07:41:30.100 に答える