- PR -

マルチスレッド?

1
投稿者投稿内容
sinh
ベテラン
会議室デビュー日: 2003/01/22
投稿数: 87
投稿日時: 2003-10-23 00:34
サーブレットについてよくわからないところがあるのですが、
サーブレットはマルチスレッドで動いていると本にありました。
それならjava.utilのArrayListやHashMapよりもVectorやHashtable
を用いたほうがよいのでしょうか?
t-wata
大ベテラン
会議室デビュー日: 2002/07/12
投稿数: 209
お住まい・勤務地: 東京
投稿日時: 2003-10-23 00:58
> それならjava.utilのArrayListやHashMapよりもVectorやHashtable
> を用いたほうがよいのでしょうか?

Servletはフィールドに何も置くべきではないです(特に、Hashtable/HashMapやVector/ArrayListみたいなmutableなオブジェクトは)。
ローカル変数なら、何使っても問題ないですが。
未記入
ぬし
会議室デビュー日: 2002/03/28
投稿数: 255
投稿日時: 2003-10-23 01:59
>>サーブレットはマルチスレッドで動いていると本にありました。
その通り.通常は各クラスごとにインスタンスが一つのみ生成され,
多数のスレッドが同時に走ります.
#JSPも一種のServetなので,全く同じ事が言える.

>>それならjava.utilのArrayListやHashMapよりもVectorやHashtable
>>を用いたほうがよいのでしょうか?
逆です.VectorやHashtableは絶対と言って良いほど使ってはいけません.
同期自体を極力避けるべきです.これはマルチスレッドプログラミングの
常識です.

>Servletはフィールドに何も置くべきではないです
とあるように,staticフィールドだろうとインスタンスフィールドだろうと,
通常は使わない方が無難です.マルチスレッドのことが分からない人
の場合は特にそうです.もしここにVectorを置いて乱用しようものなら
悲惨な結果になることが見えています.

このことが分かってない人は,まず並列プログラミングそのものを勉強しないと
おそらくまともなプログラムは組めません.
とまと
ベテラン
会議室デビュー日: 2003/10/18
投稿数: 51
投稿日時: 2003-10-23 06:13
おはようございます。

Vector、Hashtable、同期化コードの記述は
避けられるなら使用しない方がいい。
なぜならば、同期化処理は処理コストが高いので、
乱用すればパフォーマンスに影響する。
また、デッドロックなどのバグを引き起こす
原因にもなる。
サーブレットの場合を例にとれば、
インスタンス変数(static変数も含む)を使用せずに、
ローカル変数を定義すれば避けられる。

というのが、スレッド初心者である私の理解です。

このような問題を持ったシステムが
運用されている(されていた)ケースは
意外と多いのではと推測してしまいます。
以前途中から参加したB2Bパッケージの開発では、
システム基盤を担当されている方が、
サーブレットクラスごとにインスタンスが1つのみ生成されるという
事実を知らずに、インスタンス変数(Vectorなど)を多用しているケース
がありました。
ここまでひどくないにしても、
HttpSessionに格納するオブジェクトに関して
同期化を考慮しているシステムは少ないのではないでしょうか。
ダブルクリック、一人のユーザがHttpSessionの競合が
発生するようなリクエストを連続送信した場合、
どのような対策を取られているのでしょうか。


[ メッセージ編集済み 編集者: とまと 編集日時 2003-10-23 06:17 ]

[ メッセージ編集済み 編集者: とまと 編集日時 2003-10-23 09:44 ]
sinh
ベテラン
会議室デビュー日: 2003/01/22
投稿数: 87
投稿日時: 2003-10-24 12:42
できるかぎりローカル変数でのみ定義して、やっていきたいと思います。
ありがとうございました。
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2003-10-27 10:39
unibon です。こんにちわ。

引用:

とまとさんの書き込み (2003-10-23 06:13) より:
Vector、Hashtable、同期化コードの記述は
避けられるなら使用しない方がいい。
なぜならば、同期化処理は処理コストが高いので、
乱用すればパフォーマンスに影響する。
また、デッドロックなどのバグを引き起こす
原因にもなる。


デッドロックについてですが、
ArrayList の代わりに Vectorを使ったり、
HashMap の代わりに Hashtable を使っても、
その行為自体(ArrayList/HashMap から Vector/Hashtable への置き換え)が
直接、デッドロックにつながることはないと思います。
これは、Vector/Hashtable の同期の範囲がメソッド内だけであり、
メソッド内では、自分自身(this)しか操作しないためです。

なお、それら以外での「同期化コードの記述」については、
やらなくて良いところなのにやれば、
たしかにデッドロックになる危険性が生まれるので、
おっしゃるように「避けられるなら使用しない方がいい」と思います。
cypher256
会議室デビュー日: 2003/11/05
投稿数: 7
投稿日時: 2003-11-05 14:33
引用:

とまとさんの書き込み (2003-10-23 06:13) より:
HttpSessionに格納するオブジェクトに関して
同期化を考慮しているシステムは少ないのではないでしょうか。
ダブルクリック、一人のユーザがHttpSessionの競合が
発生するようなリクエストを連続送信した場合、
どのような対策を取られているのでしょうか。



フレームを多用しているシステムで、間に合わせ的に対応したのが、
フロントコントローラの頭で getSession したものをまるごと
synchronized したものがあります。
# そのままリリースしてまいましたが。。。

ま〜、これは session が物理記憶に永続化されたり、クラスタ構成の
場合は正常に動かないんでしょうね。クリティカルなシステムでないなら
いいかもしれません。自己弁護ですが。
1

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