Struts1.xではActionは1つしかインスタンス生成してくれないので、スレッドセーフにするために何かしら対策を行う必要があると思います。
ネットで調べると、例えばSpringなどのDIコンテナを使うとか。
Springでscopeをprototypeにしておくと、インスタンスをリクエストごとに作成してくれるそうですが。
例えば、以下のようなコードがあるとします。
lang
1public class ActionForm { 2 private String a = null; 3 public String getA() { 4 return this.A; 5 } 6 public String setA(String argA) { 7 this.A = argA; 8}
このクラスを以下のような形で使用した場合。
lang
1public class TestAction extends EventDispatchAction { 2 protected ActionForward dispatchMethod(省略){ 3 ActionForm form= new ActionForm (); 4 //何かしらの継続処理 5 } 6}
スタック領域にはformという参照型変数ができ、ヒープ領域にActionFormが格納されると思っています。(ここが間違えていたらすいません)
そこで気になるのは、インスタンスがスレッド別に出来ていたとしてもマルチスレッドであれば、ヒープ領域にある時点でデータの書き換えが起こり得ることになりませんか?
すなわち、スレッドセーフではなくなるのではないかと思っています。
それとも、呼び出し元のアクションがスレッド別にインスタンスが生成されていれば、ヒープ領域に格納されていたとしても問題ないのでしょうか。
もしそうであれば、生成された1つのアクションからスレッド毎にメイン処理が書かれているクラスをインスタンス生成して、その中でフィールド定義などのヒープ領域に格納される変数が存在しても問題ない、スレッドセーフであるのでしょうか。
(コードに不備があっても目を瞑っていただければ。質問の意図さえ伝わればと思います。)
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/04/23 05:33
2015/04/23 06:00
2015/04/23 06:01
2015/04/23 06:06
2015/04/23 06:11
2015/04/23 07:38
2015/04/23 13:40
2015/04/23 13:52