- PR -

J2EEでコレクションの使用について

1
投稿者投稿内容
raystar
ぬし
会議室デビュー日: 2003/01/16
投稿数: 251
お住まい・勤務地: Tokyo/Japan
投稿日時: 2005-07-26 19:02
こんばんわ。
とある疑問にぶち当たってしまいました。。。

現在、strutsベースのWEBアプリをメンテしているのですが、
全ての検索処理にListやMapを使用しています。

ここまではOKだとおもうのですが、全てのコレクションオブジェクトの作り方が、

List list = Collections.synchronizedList(new ArrayList());
Map map = Collections.synchronizedMap(new HashMap());

となっていることに気付きました。

同期コレクションにラップして使用しても動きますが、
パフォーマンスがやや気になるところです。
(ラップを外して検証していませんが。。)

そこでStrutsの構造的にコレクションはどこまで同期してあげればよいのか?
という疑問にぶちあたりました。

1.Action#executeメソッド内で コレクションを new するのであれば、
  Collections.synchronizedXXXはいらないのではないか。

2.DB検索クラスのメソッドで メソッド内で new されているListは
  同期されなくてもよいのではないか。
  ただ、Listオブジェクトをそのままリターンしています。

3.検索結果を request.setAttribute して、JSPでまわす場合に、
  同期が必要か。

いかがなものなのでしょうか。

全てのコレクションが Action#executeメソッド内、DB検索するクラスのメソッド内で
new されていれば、同期処理っていらないでしょうか。

いらない!と言い切りたいものの、
全てがsynchronizedXXXにラップされていたので、
自分が間違っているのかと不安になってきました。

どなたか、ご教授ください。。。
raystar
ぬし
会議室デビュー日: 2003/01/16
投稿数: 251
お住まい・勤務地: Tokyo/Japan
投稿日時: 2005-07-26 19:31
static でなく、 メソッド内で new されたものは
スレッドセーフだと理解しています。(信じています笑)

ただ、それがJSPへ渡されるとどうなるのか。ってところが、疑問です。
でも、コレクション系は全部 request, session に入れているみたいなので、
大丈夫だろうと思っています。

間違っていたら指摘お願いします><
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2005-07-26 19:39
排他が必要かどうかは、
・複数のスレッドから同時に参照されるかどうか
・更新処理が他の更新処理や参照処理と同時に起こるかどうか
が問題です。

挙げられている例だけだと判断がつきませんが、検索結果を表示するだけの処理であれば、
通常はListオブジェクトの生存期間はリクエスト処理の間だけでしょうから、排他処理は
不要でしょう。もしかするとコレクションを生成している部分は、そのコレクションがどの
ように使われるかわからないのでそうしているのかもしれませんが、どちらかというと
余計なお世話ですね。排他処理が必要であれば受け取った側で行えばいいのです。
raystar
ぬし
会議室デビュー日: 2003/01/16
投稿数: 251
お住まい・勤務地: Tokyo/Japan
投稿日時: 2005-07-26 20:05
ukさん、こんばんわ。

なるほど、そうですよね。
メンテしてるソースでコレクションを作るところが、
全て、 Collections.synchronizedXXX されてるんですよ・・・汗

上司に説明してCollections.synchronizedXXを全部とります><

ありがとうございました。
1

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