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 ạ
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ộ
Hope it helps!