サーブレットコンテキストに格納されたオブジェクト "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;
}
Bean自体をスレッドセーフにすることをお勧めします。これは、外部から同期させる必要があることを覚えている人に依存するのではなく、通常はどのスレッドからでも呼び出せる上位レベルの操作です。また、[TOCTTOU](https://en.wikipedia.org/wiki/Time_of_check_to_time_of_use)の問題に注意してください。 – biziclop
答えによると、スレッドセーフであることが最も良い解決策です。しかし、HashMapやその他のコレクションについては、私もServletContextに格納していますか? – Yaros
スレッドセーフなコンテナにもラップしてください。しかし、サーブレット・コンテキスト(もちろん、すべてのセッションで共有される)に多数の変更可能なデータを格納していると、実際の問題がアーキテクチャーであるという疑いが生じます。 – biziclop