servletはエントリーポイントのインスタンスは1つしか作成しない。
そして、それが複数スレッドで共有される。
そのため、インスタンスフィールドはスレッドセーフにならない。
・スレッドセーフではない例
public class TestServlet extends HttpServlet {
private String name;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
name = req.getParameter("name");
PrintWriter writer = res.getWriter();
writer.print(name);
}
}
で、ここからがわからんところなのだが、
ローカル変数はスレッドセーフになるのだから、
doGetの処理の中で、以下のようなことをしたら、問題ないのか?
public class TestServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
new MyClass(req, res).execute();
}
}
public class MyClass {
private HttpServletRequest req;
private HttpServletResponse res;
public MyClass(HttpServletRequest req, HttpServletResponse res) {
this.req = req;
this.res = res;
}
public void execute() {
String name = req.getParameter("name");
PrintWriter writer = res.getWriter();
writer.print(name);
}
}
もし、上記でスレッドセーフになるっていうなら、
それでよくね?って思っちゃう。
それとも、MyClassのインスタンスフィールドは実はスレッドセーフではないのか?
メモリ使用量としては、生成するインスタンス分大きいのはわかるが、
もし上記で解決するなら、煩わしいスレッド問題とはオサラバできると思うのだが、
問題あるのだろうか?
servletはフレームワークの世界だから、厳密にわかる人は少ないのだろうけど、
ここは教えて欲しい。。。
・・・後日
上の例は大丈夫だった。
新しく記事を書きました。
コメントがあればどうぞ