セッション自体はスレッドセーフです。ただし、これは、同期を行わずに使用しても正しい動作につながるという意味ではありません。これは、複数のスレッドからアクセスされた場合にセッションが正しく動作することを意味するだけです。
たとえば、次のコードが同時に実行されているとします。
Integer visitCount = (Integer) session.getAttribute("visitCount");
visitCount = Integer.valueOf(visitCount.intValue() + 1);
session.setAttribute("visitCount", visitCount);
の元の値が 0 であると仮定しますvisitCount
。最終結果は 2 (期待値) になるか、1 になる可能性があります。実際、両方のスレッドが現在の値を同時に (0) 読み取り、両方がそれを 1 にインクリメントし、両方がセッションに保存します。
同様に、スレッドセーフでないオブジェクト (HashMap など) をセッションに格納し、2 つのスレッドがこの HashMap を同時に使用すると、異常な動作が発生する可能性があります。
すべてのマルチスレッド プログラムと同様に、必要に応じて適切な同期メカニズムを使用するか、オブジェクトをスレッド セーフにする必要があります。しかし、これは本全体の主題です。実際にはJava Concurrencyをお勧めします。