- - PR -
インスタンスメソッドのスレッドセーフ
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2007-06-04 14:47
こんにちは。 お世話になります。
スレッドセーフについて調べています。java1.5の場合。 たとえばサーブレット内で、一つのクラスをインスタンス変数として定義しておいて、 doGetメソッドを受けるたびに、そのインスタンスのメソッドをコールしたとします。 このメソッドは、ローカル変数しか使用していないとします。 そこで2つの画面で同時にアクセスした場合、この同一インスタンスのメソッドをコールすることになると思います。 同一インスタンスのメソッドを呼び出そうと、メモリに展開されるメソッドの領域は別れるため、混乱はないとみなしても良いでしょうか。 よろしくお願いします。 | ||||
|
投稿日時: 2007-06-04 16:08
ややこしい話ですね。斜め読みで思わずNGだと答えそうになりました。 同一インスタンスでもそのメソッドがローカル変数のみを使うように作られているのであれば大丈夫でしょう。 ステートレスな作りになっている(つまり内部でフィールドを使わない)メソッドはスレッドセーフです。 そもそも、特別な事情がないのであればstaticなメソッドにしてしまえばいいのですが StrategyパターンなどのインスタンスをFlywightパターンにしようとしたりするとそうなるのかな? もしくはSingletonパターン的なことをしているのか、DIコンテナを使っているのか…。 | ||||
|
投稿日時: 2007-06-04 16:46
呼び出し先のメソッドがローカル変数しか使用していない = スレッドセーフということですよね?
インスタンスが同じでもスレッドセーフなメソッドをマルチスレッドで呼び出しても大丈夫です。 nagise さんの仰るとおり、そういう場合は static メソッドとして宣言(インスタンス化しなくても呼び出せる)されても良いと思いますが。 | ||||
|
投稿日時: 2007-06-04 19:34
インスタンスを何個も作ってもメソッドは一つしかありません。インスタンスをひとつしか作っていなくてもメモリに展開されるメソッドの領域(?)が分かれるという事もありません。 スレッドごとに「スタック」が別にあるために、ローカル変数しか使用していないようなメソッドはスレッドセーフです。 _________________ 囚人のジレンマな日々 |
1