2017-08-06 15 views
1

サーブレットコンテキストに格納されたオブジェクト "myBean"にアクセスして変更するサーブレットがあります。明示的に "myBean"を同期化されたブロックでロックするか、またはデフォルトで維持されていますか?例コード:サーブレットコンテキストでオブジェクトにアクセスするときに同期ブロックが必要ですか?

public class StopFilesMergeServlet extends HttpServlet { 
     @Override 
     protected void doPost(HttpServletRequest req, HttpServletResponse resp) { 
      MYBean myBean = req.getServletContext().getAttribute("myBean"); 
      synchronized (myBean) { //is this necessary? 
       int oldValue = myBean.getProperty1(); 
       int newValue = oldValue + 10; 
       myBean.setProperty1(newValue); 
      } 
      ... 
      return; 
    } 
+0

Bean自体をスレッドセーフにすることをお勧めします。これは、外部から同期させる必要があることを覚えている人に依存するのではなく、通常はどのスレッドからでも呼び出せる上位レベルの操作です。また、[TOCTTOU](https://en.wikipedia.org/wiki/Time_of_check_to_time_of_use)の問題に注意してください。 – biziclop

+0

答えによると、スレッドセーフであることが最も良い解決策です。しかし、HashMapやその他のコレクションについては、私もServletContextに格納していますか? – Yaros

+0

スレッドセーフなコンテナにもラップしてください。しかし、サーブレット・コンテキスト(もちろん、すべてのセッションで共有される)に多数の変更可能なデータを格納していると、実際の問題がアーキテクチャーであるという疑いが生じます。 – biziclop

答えて

0

豆はスレッドセーフであることを保証するために何もしません。

シンクロナイズドブロックが必要な明示的なロック "myBean"はデフォルトで保守されていますか?

あなたの意図は明確ではありません。 Beanから値を読み取り、それを比較して更新する場合は、明示的なロックが必要です。より良いオプションは、状態がある場合はmyBeanスレッドセーフです。

+2

あなたの答えは技術的にはまだ正しいものの、Springは質問にも言及されていないと思います:) – biziclop

+0

@biziclop ha。私はどこでもそれを見るために春をあまりにも使用している必要があります:) – goblinjuice

+0

@goblinjuice私は私の例をより明確に編集します。 – Yaros

関連する問題