-1

サーブレットとスレッド化を始めたばかりです。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 はスレッドセーフでなければなりません。これを明確にしていただきありがとうございます。

4

2 に答える 2

3

メソッドに要素を追加してからページを更新するたびに、リストに 3 つの要素を追加していますdoGet

メソッドでリストを宣言するdoGetと、メソッドが呼び出されるたびにリストが消去されます。

ここにはスレッドセーフは含まれていません。

于 2016-02-03T10:13:55.743 に答える