2017-01-03 3 views
0

サーブレット以外のクラスのインスタンス変数は、以下のようなサーブレットメソッド内でインスタンス化するとスレッドセーフですか?非サーブレットクラスのインスタンス変数はスレッドセーフですか?

//Non-servlet Class 
public class x{ 

    public String var1; 
    public String var2; 

    public String method(){ 
    return (var1 + var2); 
    } 
} 

サーブレットクラス

public class myServlet extends HttpServlet { 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
     throws ServletException, IOException { 
     String varA = "Hello "; 
     String varB = "World"; 
     String varC = null; 
     x xx = new x(); 
     xx.var1 = varA; 
     xx.var2 = varB; 
     varC = xx.method(); 
    } 
} 
+0

他のスレッドと共有されていないオブジェクトがある場合は、スレッドの安全性について心配する必要はありません。 –

+0

これは、複数のスレッドがmyServlet doGetメソッドを使用している場合、クラスxのvar1とvar2はスレッドセーフではないことを意味します。私は正しい? –

答えて

1

非サーブレットクラスのインスタンス変数はスレッドセーフではありますか?

場合によっては、インスタンス変数ではなく、doGet()メソッドの実行範囲内のロケール変数です。

protected void doGet(HttpServletRequest request, HttpServletResponse response) 
     throws ServletException, IOException { 
    ... 
    x xx = new x(); 
    ... 
    } 

メソッドで宣言され使用されているロケール変数は、複数スレッドの呼び出し間で分離されています。したがって、潜在的な並行性はありません。

変数がインスタンス変数の場合、サーブレットが近いタイミングで複数回呼び出された場合、複数のスレッドが同時にアクセスできるため、競合状態になります。

public class myServlet extends HttpServlet { 
    x xx = new x(); 
    ... 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
     throws ServletException, IOException { 
    ... 
    xx.doSomething(); // concurrency race 
    xx.var1 = varA; // concurrency race 
    ... 
    } 
+0

あなたはそれが100%スレッドセーフであると言っています。右? –

+1

それらの間で分離される 'xx'の複数のインスタンスがあります。 – davidxxx

1

あなたはxこれのnewと独立したインスタンスを作成しているnew x()を呼び出すたびに、すべてのスレッドがそれ自身のコピーを持っているとあなたは、スレッドの安全性を心配する必要はありませんので、何も共有しないことを意味します。

+0

新しいインスタンス化とスレッドとは何が関係していますか?各スレッドはxの新しいインスタンスを作成しません。 –

+0

@WaleedKhan 'new x()'を呼び出すと**、その行を実行するすべてのスレッドによって毎回**、 'x'の' new'インスタンスが作成されます。それは何も起こりません。 –

+0

メソッド内部のインスタンス化に適用されますか?どのような外部の方法ですか? –

関連する問題