2012-05-03 6 views
0

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

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

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

答えて

0

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

あなたはResourceClassシングルトンへのリクエストがキューに入れられると言います。メソッドを​​とマークするか、その他のロック機構を使用しないかぎり、それらは使用できません。そうしないと、スレッドはシングルトンメソッドを同時に呼び出します。

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

+0

ありがとうございます。私はサーブレットコンテナの言葉についての良いチュートリアルを読むべきだと思います。あなたの答えは非常に有益です。 – user1294764

0

Java EEサーバーでは、各サーブレットのインスタンスが1つしかありません。 一方、各http要求は、独自のスレッドでサーバーによって処理されます。

ResourceClassのインスタンスが1つ存在するため、readResource()メソッドが同期化されているとボトルネックになります。

関連する問題