Servletのライフサイクルサーブレットのライフサイクルざっくりまとめると、コンテナ上にあるサーブレットのインスタンスは一つだけリクエスト毎にスレッドを作って処理を実行インスタンスはコンテナが終了した場合(または一定時間アクセスされなかった場合)に破棄されるという感じ(だと理解している)[1]。言葉だけ聞くとふーんって感じだけど、いろいろ遊べそうなのでごくごく簡単なコードを書いて実験してみた。以下のサーブレットにアクセスすると、cntがカウントアップされていく。ブラウザを閉じたり、他のブラウザからアクセスしたりした場合もcntの値はどんどんカウントアップされていく。cntはクラス変数では無く、インスタンス変数なのに。いうことで、インスタンスはコンテナ上に一つしかないのだなと確認できる。スレッドセーフではないようなコードを実行してみるこんなサーブレットを書いて同時アクセスするとどうなるか試した。}}まず、普通に以下のページにアクセスする。表示するのに3秒くらいかかる。次に2つのタブを開いてサーブレットに(ほぼ)同時アクセスしてみる。「一つ目のスレッドが更新する前に、二つ目のスレッドがcntの値を読み込むので、2つ目のスレッドの表示で2インクリメントされるべきところが1しかインクリメントされない」という状況を予想したが、そうならなかった。)確かスレッドはリクエスト単位じゃなくて、クライアント単位みたいな話をどこかで見たような。思ってググってるとそれらしいのを見つけた。httpdのMaxClientsと同じく、リクエスト単位ではなくクライアント単位(ソケット単位)でスレッドを割り当てる。このモデルでは、例えばmaxThreads="20"とかにしたら常に同時に20個のリクエストをさばいてくれる、という仮定は成り立たない。aliveを終了してコネクションを切断するまで処理されない。[2]おそらく異なるタブでアクセスしても同一のクライアントとして扱われたのでスレッドが生成されなかったのだろう。ChromeとFirefoxでサーブレットに同時アクセスしてみるか。