- - PR -
マルチスレッド?
1
| 投稿者 | 投稿内容 | ||||
|---|---|---|---|---|---|
|
投稿日時: 2003-10-23 00:34
サーブレットについてよくわからないところがあるのですが、
サーブレットはマルチスレッドで動いていると本にありました。 それならjava.utilのArrayListやHashMapよりもVectorやHashtable を用いたほうがよいのでしょうか? | ||||
|
投稿日時: 2003-10-23 00:58
> それならjava.utilのArrayListやHashMapよりもVectorやHashtable
> を用いたほうがよいのでしょうか? Servletはフィールドに何も置くべきではないです(特に、Hashtable/HashMapやVector/ArrayListみたいなmutableなオブジェクトは)。 ローカル変数なら、何使っても問題ないですが。 | ||||
|
投稿日時: 2003-10-23 01:59
>>サーブレットはマルチスレッドで動いていると本にありました。
その通り.通常は各クラスごとにインスタンスが一つのみ生成され, 多数のスレッドが同時に走ります. #JSPも一種のServetなので,全く同じ事が言える. >>それならjava.utilのArrayListやHashMapよりもVectorやHashtable >>を用いたほうがよいのでしょうか? 逆です.VectorやHashtableは絶対と言って良いほど使ってはいけません. 同期自体を極力避けるべきです.これはマルチスレッドプログラミングの 常識です. >Servletはフィールドに何も置くべきではないです とあるように,staticフィールドだろうとインスタンスフィールドだろうと, 通常は使わない方が無難です.マルチスレッドのことが分からない人 の場合は特にそうです.もしここにVectorを置いて乱用しようものなら 悲惨な結果になることが見えています. このことが分かってない人は,まず並列プログラミングそのものを勉強しないと おそらくまともなプログラムは組めません. | ||||
|
投稿日時: 2003-10-23 06:13
おはようございます。
Vector、Hashtable、同期化コードの記述は 避けられるなら使用しない方がいい。 なぜならば、同期化処理は処理コストが高いので、 乱用すればパフォーマンスに影響する。 また、デッドロックなどのバグを引き起こす 原因にもなる。 サーブレットの場合を例にとれば、 インスタンス変数(static変数も含む)を使用せずに、 ローカル変数を定義すれば避けられる。 というのが、スレッド初心者である私の理解です。 このような問題を持ったシステムが 運用されている(されていた)ケースは 意外と多いのではと推測してしまいます。 以前途中から参加したB2Bパッケージの開発では、 システム基盤を担当されている方が、 サーブレットクラスごとにインスタンスが1つのみ生成されるという 事実を知らずに、インスタンス変数(Vectorなど)を多用しているケース がありました。 ここまでひどくないにしても、 HttpSessionに格納するオブジェクトに関して 同期化を考慮しているシステムは少ないのではないでしょうか。 ダブルクリック、一人のユーザがHttpSessionの競合が 発生するようなリクエストを連続送信した場合、 どのような対策を取られているのでしょうか。 [ メッセージ編集済み 編集者: とまと 編集日時 2003-10-23 06:17 ] [ メッセージ編集済み 編集者: とまと 編集日時 2003-10-23 09:44 ] | ||||
|
投稿日時: 2003-10-24 12:42
できるかぎりローカル変数でのみ定義して、やっていきたいと思います。
ありがとうございました。 | ||||
|
投稿日時: 2003-10-27 10:39
unibon です。こんにちわ。
デッドロックについてですが、 ArrayList の代わりに Vectorを使ったり、 HashMap の代わりに Hashtable を使っても、 その行為自体(ArrayList/HashMap から Vector/Hashtable への置き換え)が 直接、デッドロックにつながることはないと思います。 これは、Vector/Hashtable の同期の範囲がメソッド内だけであり、 メソッド内では、自分自身(this)しか操作しないためです。 なお、それら以外での「同期化コードの記述」については、 やらなくて良いところなのにやれば、 たしかにデッドロックになる危険性が生まれるので、 おっしゃるように「避けられるなら使用しない方がいい」と思います。 | ||||
|
投稿日時: 2003-11-05 14:33
フレームを多用しているシステムで、間に合わせ的に対応したのが、 フロントコントローラの頭で getSession したものをまるごと synchronized したものがあります。 # そのままリリースしてまいましたが。。。 ま〜、これは session が物理記憶に永続化されたり、クラスタ構成の 場合は正常に動かないんでしょうね。クリティカルなシステムでないなら いいかもしれません。自己弁護ですが。 | ||||
1
