私はサーブレットに取り組んでおり、サーブレットを同期させたいと思っています。それが可能になる方法を教えてください。
3 に答える
サーブレットを同期させることは、非常に悪い設計です。その主な目的は破壊されます。サーブレットは、複数のリクエストを同時に処理できるように設計する必要があります。さらに、サーブレットには状態ストレージを含めてはならず、同期の必要性を押し付けるべきではありません。デザインを考え直してください
コードのブロックを同期すると、システムにボトルネックが発生します。コード ブロックを同期する場合、特定の時点でこの同期されたコード ブロック内に存在できるスレッドは 1 つだけであることを JVM に伝えます。マルチスレッド アプリケーションを実行していて、スレッドが別のスレッドによって実行されている同期コード ブロックに遭遇した場合、2 番目のスレッドは、最初のスレッドがそのブロックを終了するまで待機する必要があります。
本当に同期が必要なコード ブロックを正確に特定し、できるだけ同期を少なくすることが重要です。
ローカルのデータやパラメーターを同期する必要はありません (すべきではない) ことに注意してください。特に、service() メソッドを同期するべきではありません! (または doPost()、doGet() など)
スレッドセーフなサーブレットを有効にするためのより良いアプローチは何ですか? SingleThreadModel インターフェイスまたは同期?
SingleThreadModel 手法は使いやすく、ボリュームの少ないサイトではうまく機能しますが、スケーリングはうまくいきません。将来ユーザーが増えると予想される場合は、共有データの明示的な同期を実装することをお勧めします。ただし、マルチスレッドを最大限に活用できるように、同期するコードの量を効果的に最小限に抑えることが重要です。
また、サーバーの観点から見ると、SingleThreadModel はかなりのリソースを消費することに注意してください。ただし、最も深刻な問題は、同時リクエストの数がサーブレット インスタンス プールを使い果たす場合です。その場合、サービスされていないすべてのリクエストは、何かが解放されるまでキューに入れられます。これにより、パフォーマンスが低下します。使用量は非決定論的であるため、メモリを追加してインスタンス プールのサイズを増やしたとしても、あまり役に立たない場合があります。