サーブレットとスレッド化を始めたばかりです。Final インスタンス変数はスレッド セーフであり、CopyOnArrayList も同様です。次のコードがスレッドセーフではないのはなぜですか (これは最終的なものです + CopyOnArrayList を使用しました)。
@WebServlet("/index.html")
public class CatServlet extends HttpServlet {
private final static long serialVersionUID = 1L;
private final static String VIEW = "/WEB-INF/JSP/index.jsp";
**private final CopyOnWriteArrayList <Cat> l = new CopyOnWriteArrayList<>();**
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
l.add(new Cat("Dean", 7));
l.add(new Cat("Sam", 7));
l.add(new Cat("Pixie", 0));
request.setAttribute("catList", l);
request.getRequestDispatcher(VIEW).forward(request, response);
}
JSP コード:
<c:forEach var="cat" items="${catList}" >
<li>${cat.name}</li>
</c:forEach>
最初に 3 つの Cat インスタンスを取得します。更新すると 6 になり、次に 9、12 などになります。なぜですか? この問題は、doGet メソッド内で CopyOnWriteArrayList を宣言した場合や、単純な配列で宣言した場合には発生しません。その背後にあるロジックがわかりません: final インスタンス変数と CopyOnWriteArrayList はスレッドセーフでなければなりません。これを明確にしていただきありがとうございます。