Class ArrayList là không đồng bộ (non-synchronized)?

Lớp ArrayList là không đồng bộ (non-synchronized).

ai có thể giải thích rõ hơn cho mình về cái này không ạ

Hi there,

Điều đó có nghĩa là lớp ArrayList không phải thread-safe - Cậu không nên dùng nó trong trường hợp nhiều app của cậu có nhiều thread, và có khả năng cùng sửa 1 ArrayList.

Consider this scenario, cậu có empty ArrayList: {}.
Trong application, cậu tạo ra 2 threads A và B. Tại 1 thời điểm, 2 thread này cùng add 1 phần tử vào list.
Dưới đây là implement của hàm add trong ArrayList (Open JDK 11)

    /**
     * This helper method split out from add(E) to keep method
     * bytecode size under 35 (the -XX:MaxInlineSize default value),
     * which helps when add(E) is called in a C1-compiled loop.
     */
    private void add(E e, Object[] elementData, int s) {
        if (s == elementData.length)
            elementData = grow();
        elementData[s] = e; // <========= Note this!!!
        size = s + 1;
    }

    /**
     * Appends the specified element to the end of this list.
     *
     * @param e element to be appended to this list
     * @return {@code true} (as specified by {@link Collection#add})
     */
    public boolean add(E e) {
        modCount++;
        add(e, elementData, size);
        return true;
    }

Như cậu thấy ở phần Note this!!!, khi code ở cả 2 thread cùng thực hiện tới vị trí đó, cả 2 phần tử đó sẽ được đặt ở elementData[0] (do size của list lúc này vẫn là 0), dẫn tới chỉ có 1 phần tử được add vào trong list (lẽ ra là 2).

Đó là lý do class ArrayList không đồng bộ :smiley:

Hope it helps!

6 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?