プロが教える店舗&オフィスのセキュリティ対策術

ここ教えてgooでもこの類の質問は多いですが、現在ある問題に直面しています。過去の質問を見てもピンと来るものがなかったので、2つ質問させてもらいます。
1.
1リクエスト1インスタンスではないことは過去の質問やブログでもわかりました。ということは1リクエスト(サブミット)1スレッドという解釈でよろしいでいいと思います。これを踏まえて例えさせてください。
10台の端末からほぼ同時に同一アクションへサブミットした場合、1つのインスタンスから10スレッドが生まれるということでいいでしょうか?今直面している問題は、トークンチェック等2重サブミット対応をしていない状態で、1台の端末(自分)でサブミットを連打した場合(例えば10回)、10台の端末から同時アクセスした場合と同じ状況になるのでしょうか?

2.
以下はソースのイメージです。
// アクションクラス
BarAction継承クラス {
 execute {
  ~中略~
  HogeLogic logic = new HogeLogic();
  logic.doLogic();
  ~中略~
 }
}
// ロジック
HogeLogicクラス {
 //インスタンス変数
 FooService service=new FooService();
 doLogic {
  ~中略~
  service.insert();
  ~中略~
 }
}
分かりづらかったら申し訳ないです。
言いたいことはBarAction#execute内でHogeLogicクラスを生成しています。ということは生成されたHogeLogicのインスタンス(logic)はスレッドセーフだと思います。
しかしHogeLogicクラスではFooService.serviceがインスタンス変数として宣言されています。
この場合、FooService.serviceはスレッドセーフなのでしょうか?

A 回答 (2件)

insert内の処理でスレッドセーフでないクラスを使用すればスレッドセーフでなくなります。



したがってクラスが完成するまでスレッドセーフであるかないかはわかりません。
修正ひとつでスレッドセーフだったクラスも、そうでなくなります。

スレッドセーフの判断基準を自分で理解し、完成したクラスを見て判断するしかないですね。
    • good
    • 0

FooService.serviceがスレッドセーフか否かは中身がわからないので判断できません。



wikiにも書いてありますので参考にしてみてください。(スレッドセーフかどうかの判断基準)
http://ja.wikipedia.org/wiki/%E3%82%B9%E3%83%AC% …

簡単な例を言うと、staticな変数(クラス変数)をFooService.serviceが宣言していて、その変数を同期化等を行わず使用した場合はスレッドセーフにはなりません。

この回答への補足

説明不測でした。
FooServiceにstaticな変数(クラス変数)はありません。
FooService内は下記のようなイメージです。
FooService {
 HogeDao dao;
 insert() {
  //insert処理
 }
 getDao() {
  //ただのゲッター
 }
 setDao(HogeDao dao) {
  // ただのセッター
 }
}

また、URLのスレッドセーフかどうかの判断基準をみましたが、該当する項目はありせんでした。

補足日時:2009/01/29 14:01
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!