サーブレットにはグローバルに宣言された変数があるため、競合状態があることを知りました。だから私の質問は、doGet
またはdoPost
メソッドから離れたいくつかのメソッドでこれらの変数を宣言する場合です。それらは異なるスレッド間で共有されませんか?サーブレットで宣言されたメソッドはスレッドセーフであるか、サーブレットのローカル変数はスレッドセーフです
「はい」の場合、競合状態を回避するにはどうすればよいですか。私はThreadLocal
の使用とsingelThreadModel
の使用を避けたいと思います。ここで
は
public class UserServlet extends HttpServlet {
private String userString1 = "";
private String userString2 = "";
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
someTask(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
someTask(request, response);
}
public void someTask(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
userString1 = request.getParameter("someParameter");
userString2 = request.getParameter("someParameter");
}
}
注例である:これはあくまで一例ではなく、実際のコードです。
私はuserString1 = "" 'プライベート文字列を宣言した場合どのような。 プライベート文字列userString2 = "";一部のタスクメソッドでは です。 競合状態の問題を解決しますか? –
はい、それは解決しますし、メソッドで宣言された変数に 'private'を使うことはできません。' String userString1 = request.getParameter( "someParameter"); ' –
@SabirKhanこれらのローカル変数がスレッドセーフであることを私が参照できる何らかのドキュメントがありますか? また、ローカルの宣言された変数に含まれる情報を複数のスレッドに共有させるパブリックメソッドのインスタンスが1つ存在することを知りました。本当 ? –