Vì vậy, trước hết tài liệu cho ArrayList nói rằng nó không phải là chủ đề an toàn, vì vậy tôi sẽ không khuyên bạn nên sử dụng nó trong trường hợp như vậy. Hơn nữa, ngay cả khi lý thuyết này có tác dụng, bạn vẫn có vấn đề đảm bảo rằng bất cứ ai duy trì chương trình này nhớ lại những ràng buộc nghiêm ngặt mà bạn đã áp đặt khi đọc và viết với sự vui nhộn sau đó nếu họ không làm vậy! Điều đó nói rằng, câu hỏi của bạn là thực sự thú vị từ một quan điểm lý thuyết vì vậy tôi nghĩ rằng tôi muốn có một cái nhìn. Điều đầu tiên cần lưu ý là bất kỳ độc giả nào đã cố gắng truy cập danh sách thông qua một trình lặp, sau đó sớm hay muộn, việc đọc sẽ thất bại với một ConcurrentModificationException. Đó là bởi vì mọi sửa đổi đối với danh sách được theo dõi và Iterator không nhanh nếu nó phát hiện một sửa đổi bên ngoài trình lặp.
Điều đó nói rằng, bạn không chỉ định nhu cầu sử dụng trình vòng lặp trong câu hỏi ban đầu của bạn vì vậy điều gì sẽ xảy ra nếu bạn hạn chế mình chỉ cần thêm bằng cách thêm và đọc bằng get() và size()? Trong trường hợp này tôi vẫn nghĩ bạn có thể thấy sự thất bại không thường xuyên vì trong danh sách lưu trữ kích thước hiện tại cùng với mảng dữ liệu sao lưu và không biến nào được đánh dấu là dễ bay hơi. Kết quả là (và do bảo đảm bộ nhớ của Java) tôi sẽ nghĩ rằng về mặt lý thuyết có thể cho một trong các chủ đề đọc để xem một biến kích thước cập nhật trong khi dữ liệu vẫn chưa được cập nhật. Trong trường hợp này, bạn có thể kết thúc dữ liệu rác được trả lại hoặc thậm chí là indexOutOfBounds.
"Cấu trúc đồng thời ưa thích" ... Có ['ReadWriteLock'] (https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/locks/ReadWriteLock.html) nó gần như tầm thường để thực hiện. – aioobe
Đối tượng có bị đột biến không? Đánh dấu. Nó có được truy cập bởi nhiều luồng không? Đánh dấu. Đối tượng có đi kèm với bất kỳ đảm bảo an toàn luồng nào không? Không. Xin chúc mừng, bạn cần một số loại đồng bộ hóa! Danh sách kiểm tra thực sự là đơn giản. – biziclop
Bạn có quan tâm đến thứ tự chèn không? – Makoto