Section7 - スレッド・セーフなサーブレットのデザインと開発

7.1 以下のいづれがスレッド・セーフな属性スコープか記述

項目 スレッドセーフか? 説明
ローカル変数 Yes  
インスタンス変数 No サーブレットのインスタンス変数はスレッドセーフではありません。
ただし、SingleThreadModelをimplementsした場合はスレッドセーフです(後述)。
static変数 No  
リクエストオブジェクトの属性 No リクエストオブジェクト自体はスレッドセーフ。 ただし、セットする属性オブジェクトはスレッドセーフとは限らない (ビジネスオブジェクトからセッションデータの参照をわたされていたり。。。出題された場合、答えが微妙なところ)。
セッションオブジェクトの属性 No 同じクライアントが複数のリクエストを同時に投げることがあります。
ServletContextの属性 No アプリケーション全体で共有されます。

7.2 シングルスレッドモデルのサーブレットとマルチスレッドモデルの サーブレットの相違について正しい記述をする

通常、Servletはシングルインスタンス マルチスレッドで動きます。 つまり、サーブレットのインスタンスは1つで、このインスタンスに対して、 複数のリクエストが平行して実行される、ということです。
1つのインスタンスが複数の同時リクエストで共有されるため、 サーブレットのフィールドはスレッドセーフではありません

手っ取り早くスレッドセーフにする方法として、 サーブレットにSingleThreadをimplementsするという方法があります。 サーブレットコンテナにより、リクエストは順番に処理され、 サーブレットのフィールドもスレッドセーフになります。

7.3 シングルスレッドモデルに使用されなくてはならないサーブレットを 宣言するために使用されるインターフェイスを記述

javax.servlet.SingleThreadMedelです。
public class HogeServlet extends HttpServlet implements SingleThreadModel{
  //....
}

同期している間は、他のスレッド(リクエスト)が待たされるので、 処理速度を考えると、同期する範囲をなるべく小さくした方がよいです。 SingleThreadMedelを使うよりは、同期が必要な部分のみsynchronizedした方が よいでしょう。 というわけで、あんまり使わないと思われますが、 手っ取り早く同期したい時には、簡単かつ明確でいいかもしれません。