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はフレームワークの世界だから、厳密にわかる人は少ないのだろうけど、
ここは教えて欲しい。。。
・・・後日
上の例は大丈夫だった。
新しく記事を書きました。
コメントがあればどうぞ