2017-07-20 20 views
0

サーブレットにはグローバルに宣言された変数があるため、競合状態があることを知りました。だから私の質問は、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"); 

     } 
} 

注例である:これはあくまで一例ではなく、実際のコードです。

答えて

0

は、サーブレットで宣言されているメソッドはスレッドセーフされている

やサーブレット内のローカル変数は、スレッドセーフ

私は、条件の周りのレースは私のサーブレット

レース条件がある中であることを知って持っています。

私はいくつかのグローバルに宣言された変数を使用しています。

という変数があります。

私はdoGet()doPost()方法とは別に、いくつかの方法でこれらの変数を宣言するのであれば、私の質問は、それらが異なるスレッド間で共有されていないことでしょうか?

ローカル変数は、それらがで宣言されているメソッドに対してローカルです。

はい場合は、どのように我々は条件の周りにレースを回避することができます。

私はあなたの二重否定をたどることはできませんが、それはまだレース状態です。標準的な用語を誤用しないでください。可能であれば、Servletのインスタンスメンバーは、それらのメソッドのすべての同時呼び出しで共通していない限り、それらを避ける必要があります。要求ごとの変数はメソッドローカルでなければならず、メソッド間でパラメータまたは戻り値として渡されなければなりません。

ThreadLocalの使用とSingleThreadModelの使用を避けたいと思います。

是非してください。Servletには、ThreadLocalを動作させる特定のスレッドセマンティクスはなく、SingleThreadModelは廃止され、削除されます。

+0

私はuserString1 = "" 'プライベート文字列を宣言した場合どのような。 プライベート文字列userString2 = "";一部のタスクメソッドでは です。 競合状態の問題を解決しますか? –

+0

はい、それは解決しますし、メソッドで宣言された変数に 'private'を使うことはできません。' String userString1 = request.getParameter( "someParameter"); ' –

+0

@SabirKhanこれらのローカル変数がスレッドセーフであることを私が参照できる何らかのドキュメントがありますか? また、ローカルの宣言された変数に含まれる情報を複数のスレッドに共有させるパブリックメソッドのインスタンスが1つ存在することを知りました。本当 ? –

0

サーブレットはJavaクラスであるため、状態がない場合(つまり、状態変数がない場合)スレッドセーフです。あなたの側から特別な行動は必要ありません。

今、あなたのような状態変数を導入 - userString1 & userString2とサーブレットはまだスレッドすることができます - Stringは不変であることから、安全が、それは一つのスレッドのかもしれないによって割り当てので、スレッドセーフ残らないように、あなたは、要求ごとにその参照を再割り当てされています他のスレッドによって他の値に変更されます(スレッドがスレッドを使用しようとするまでに)。 someTaskメソッドで行っているように参照を再割り当てしない限り、不変のままの状態&はスレッドセーフのままにすることができます。

したがって、これらの文字列変数は、すべての要求スレッドに一定の文字列を渡すことを目的としています。

また、あなたのコードでは、someTaskメソッドの代入式でヒープにたくさんのStringを配置しています。

最後に、これらのメソッドで可変状態のオブジェクトを使用する必要がある場合でも、Java同期構造を利用してクラスのスレッドを安全にする必要がありますが、JVMごとにプレーンなJava同期構造があります。クラスタに分散されています。その場合には、いくつかの分散ロック機構が必要になります。

0

グローバル変数を宣言し、doGetまたはdoPostメソッドで値を割り当てる場合、サーブレットを呼び出す別のスレッドによって確実にオーバーライドされます。 は、サーブレット・メソッド呼び出しでグローバル変数に値を割り当てるべきではありません。

あなたのコードでは、userString1 & userString2の内部メソッドを宣言するのを止めていますか?なぜそれらをグローバルに宣言したいのですか?これらの変数をサーブレットの異なるメソッドで使用する場合は、それらをグローバル変数として宣言するのではなく、単にメソッドの引数として渡します。

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    String userString1 = request.getParameter("someParameter"); 
    String userString2 = request.getParameter("someParameter"); 
    someTask(request, response, userString1, userString2); 
} 

public void someTask(HttpServletRequest request, HttpServletResponse response, String userString1, String userString2) throws ServletException, IOException { 
    //do whatever you want with these variables. 
} 

OR

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    someTask(request, response); 
} 

public void someTask(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    String userString1 = request.getParameter("someParameter"); 
    String userString2 = request.getParameter("someParameter"); 

    //do whatever you want with these variables. 
} 
+0

私は 'someTask'メソッドでこれらの変数をすべて宣言することを考えていました。これについてあなたの視点は何ですか? –

+0

あなたは 'someTask'メソッドでこれらの変数を宣言することもできます。それらはメソッドにとってローカルなのでスレッドセーフです。 –

+0

@SidhantBansalこの回答があなたの問題を解決しましたか? –

関連する問題