- PR -

インスタンスメソッドのスレッドセーフ 

1
投稿者投稿内容
れんれん
常連さん
会議室デビュー日: 2005/07/25
投稿数: 44
投稿日時: 2007-06-04 14:47
こんにちは。 お世話になります。

スレッドセーフについて調べています。java1.5の場合。
たとえばサーブレット内で、一つのクラスをインスタンス変数として定義しておいて、
doGetメソッドを受けるたびに、そのインスタンスのメソッドをコールしたとします。
このメソッドは、ローカル変数しか使用していないとします。

そこで2つの画面で同時にアクセスした場合、この同一インスタンスのメソッドをコールすることになると思います。
同一インスタンスのメソッドを呼び出そうと、メモリに展開されるメソッドの領域は別れるため、混乱はないとみなしても良いでしょうか。

よろしくお願いします。
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2007-06-04 16:08
引用:

れんれんさんの書き込み (2007-06-04 14:47) より:
たとえばサーブレット内で、一つのクラスをインスタンス変数として定義しておいて、
doGetメソッドを受けるたびに、そのインスタンスのメソッドをコールしたとします。
このメソッドは、ローカル変数しか使用していないとします。

そこで2つの画面で同時にアクセスした場合、この同一インスタンスのメソッドをコールすることになると思います。
同一インスタンスのメソッドを呼び出そうと、メモリに展開されるメソッドの領域は別れるため、混乱はないとみなしても良いでしょうか。



ややこしい話ですね。斜め読みで思わずNGだと答えそうになりました。
同一インスタンスでもそのメソッドがローカル変数のみを使うように作られているのであれば大丈夫でしょう。
ステートレスな作りになっている(つまり内部でフィールドを使わない)メソッドはスレッドセーフです。

そもそも、特別な事情がないのであればstaticなメソッドにしてしまえばいいのですが
StrategyパターンなどのインスタンスをFlywightパターンにしようとしたりするとそうなるのかな?
もしくはSingletonパターン的なことをしているのか、DIコンテナを使っているのか…。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2007-06-04 16:46
呼び出し先のメソッドがローカル変数しか使用していない = スレッドセーフということですよね?

インスタンスが同じでもスレッドセーフなメソッドをマルチスレッドで呼び出しても大丈夫です。
nagise さんの仰るとおり、そういう場合は static メソッドとして宣言(インスタンス化しなくても呼び出せる)されても良いと思いますが。
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2007-06-04 19:34
引用:

そこで2つの画面で同時にアクセスした場合、この同一インスタンスのメソッドをコールすることになると思います。
同一インスタンスのメソッドを呼び出そうと、メモリに展開されるメソッドの領域は別れるため、混乱はないとみなしても良いでしょうか。


インスタンスを何個も作ってもメソッドは一つしかありません。インスタンスをひとつしか作っていなくてもメモリに展開されるメソッドの領域(?)が分かれるという事もありません。
スレッドごとに「スタック」が別にあるために、ローカル変数しか使用していないようなメソッドはスレッドセーフです。

_________________
囚人のジレンマな日々
1

スキルアップ/キャリアアップ(JOB@IT)