項目 | スレッドセーフか? | 説明 |
---|---|---|
ローカル変数 | Yes | |
インスタンス変数 | No | サーブレットのインスタンス変数はスレッドセーフではありません。
ただし、SingleThreadModelをimplementsした場合はスレッドセーフです(後述)。 |
static変数 | No | |
リクエストオブジェクトの属性 | No | リクエストオブジェクト自体はスレッドセーフ。 ただし、セットする属性オブジェクトはスレッドセーフとは限らない (ビジネスオブジェクトからセッションデータの参照をわたされていたり。。。出題された場合、答えが微妙なところ)。 |
セッションオブジェクトの属性 | No | 同じクライアントが複数のリクエストを同時に投げることがあります。 |
ServletContextの属性 | No | アプリケーション全体で共有されます。 |
public class HogeServlet extends HttpServlet implements SingleThreadModel{ //.... }
同期している間は、他のスレッド(リクエスト)が待たされるので、 処理速度を考えると、同期する範囲をなるべく小さくした方がよいです。 SingleThreadMedelを使うよりは、同期が必要な部分のみsynchronizedした方が よいでしょう。 というわけで、あんまり使わないと思われますが、 手っ取り早く同期したい時には、簡単かつ明確でいいかもしれません。