2016-06-24 6 views
0

私はJava Servletを繰り返しコードを使用していますが、これをコードを消去するメソッドに渡します。メソッドに並行性の問題があるサーブレット?

補助メソッドを使用すると、問題が並列処理の問題になることがあります。

本当ですか?私は内側に、このコードでメソッドを作成し、必要なときにメソッドを呼び出します

if(session.getAttribute("attemps") == null) { 
    session.setAttribute("attemps", 1); 
} 
else { 
    Integer attemps = (Integer) session.getAttribute("attemps"); 
    session.setAttribute("attemps", attemps + 1); 
} 

これを数回繰り返している私のコードです。

ありがとうございました。

+0

ですで終わるだろう、その値を1に設定することができます同時セッションは同じセッションで行われますか?あるいは、複数のリクエストによって呼び出されているサーブレットについて話していますか? –

+0

私は、サーブレットが複数のリクエストによって呼び出されていると話していました。それは私の主な関心ですが、もし両方の解決策があれば...私はうれしいでしょう:) – Ommadawn

+1

サーブレットが複数の要求によって呼び出されている場合、各セッションは独自の属性を持ち、コードを整理するのがうまくいくはずです。各リクエストで、マルチスレッドをやっている場合を除きます。同じリクエストで並行性が心配な場合は、同期メソッドを読み、一度に1つのスレッドしかそのメソッドにアクセスできないようにすることをお勧めします。 –

答えて

1

コードを別のメソッドに抽出すると、並行性の問題は発生しません。並行性の問題は、複数の同時スレッドが可変状態にアクセスしたときに発生します。

あなたはここで可変状態を持っています:セッション。同じブラウザからの2つの要求を同時に処理でき、競合状態に陥る可能性があります。セッション自体はスレッドセーフですが、セッションではcheck-then-actアクションとget-then-setアクションを実行しているため、セッションは安全ですが、結果が正しくない可能性があります。

例えば、2つのスレッドが同時にヌルをチェックするかもしれないが、同時に試みがnullとして属性を見ることができた、との両方のあなたは、このように1つの試みの代わりに、2

+0

ありがとう、@ JBNizet! したがって、私のメソッドの内容をラップして何かをするのは良い考えです。 (ロック){ //私のコンテンツ } – Ommadawn

+0

メソッドがシングルトーンであるサーブレット内にある場合はyesです。私はむしろ専用の正真正銘の最終ロックを使用したいと思います。ただし、どちらの方法でも、他のセッションの他のスレッドが実行されるのをブロックします。おそらくバグの取引ではないでしょう。 –

関連する問題