2011-12-31 14 views
3

サーブレットのコードを同期ブロックと同期させることができます。しかし、私は、サーブレットのインスタンスが1つしかないのに対して、サーブレットコンテナがインスタンスのプールを保持していることが多いことも読んでいます。確かにこれは、要求されたスレッドがどのインスタンスを選択するかわからないため、同期ブロックが動作することが保証されていないことを意味します。複数のインスタンスのサーブレット同期

+0

ここであなたの質問は何ですか? – milan

+2

私はあなたがBalusCからこれらの2つの答えを読むべきだと思います:[サーブレットはどのように機能しますか?](http://stackoverflow.com/questions/3106452/how-do-servlets-work-instantiation-session-variables-and-multithreading/ 3106909#3106909)と[サーブレットのインスタンス](http://stackoverflow.com/questions/2183974/difference-each-instance-of-servlet-and-each-thread-of-servlet-in-servlets/2184147#2184147) –

+2

ありがとう、これらの2つの答えからのコンセンサスは、サーブレットごとに1つのインスタンスが使用されるため、同期が機能することです。 – Jon

答えて

1

サーブレットコンテナには、要求を処理するためのスレッドプールがあります。つまり、サーブレットコードを実行するスレッドが複数存在する可能性があります。つまり、共有可能な変更可能なデータへのアクセスを適切に同期させる必要があります。

3

2.2(3.0)は言う:分散環境(デフォルト)でホストされていないサーブレットの

、 サーブレットコンテナは、サーブレットごとに1つのインスタンスのみを使用する必要があります。 宣言

したがって、コンテナがインスタンスのプールを使用する場合、その仕様に違反しています。サーブレットの開発者は、複数のスレッドがサーブレットに同時にアクセスできることを知っているため、コンテナがそれを行う理由はわかりません。したがって、サーブレットはスレッドセーフでなければなりません。

+0

ありがとう、これは私が期待するものです。私は、Tomcatが各サーブレットのインスタンスを1つ実装していることを知りました。どちらかと言えば誤解されているか、実際には一部のコンテナが仕様に違反しています。 – Jon

+1

「スレッドのプール」と「サーブレットインスタンスのプール」を混同していることがあります。 –

関連する問題