Skip to content
2010/08/19 / highmt

Java Webアプリケーションからセッションを触るときにsynchronizedは必要なのか?

Java Servlet Specification 2.5では…

SRV.7.7.1 Threading Issues
Multiple servlets executing request threads may have active access to the same session
object at the same time. The container must ensure that manipulation of internal
data structures representing the session attributes is performed in a thread safe manner.
The Developer has the responsibility for thread safe access to the attribute
objects themselves. This will protect the attribute collection inside the HttpSession
object from concurrent access, eliminating the opportunity for an application
to cause that collection to become corrupted.

セッションオブジェクトに格納されている各属性オブジェクト自身を触る場合は開発者が気をつけないといけないけど、
セッションオブジェクトへのアクセス自体はコンテナが同期化してくれる、ということらしい。

ちなみに、ASP.NETの場合は、

ASP.NET セッション状態へのアクセスは、セッションごとに排他的です。つまり、2 人のユーザーが同時に要求を行った場合、別々のセッションへの同時アクセスは許可されます。ただし、2 つの同時要求が同じセッションに対して行われた場合 (つまり、同じ SessionID 値を使用して)、受け取られた最初の要求は、セッション情報への排他的アクセスを取得し、2 つめの要求は最初の要求が完了した時点、または最初の要求がロック タイムアウトを経過したことによって情報への排他的なロックが解除された時点で実行されます。EnableSessionState ページ ディレクティブが ReadOnly に設定されている場合、読み取り専用のセッション情報を要求しても、セッション データへの排他的ロックは生じません。セッション データに対する読み取り専用要求は、セッション データの読み取り/書き込み要求によるロックが解除されるまで、待機する必要があります。(http://msdn.microsoft.com/ja-jp/library/ms178581%28v=VS.80%29.aspx)

広告
%d人のブロガーが「いいね」をつけました。