Trong ứng dụng của chúng tôi, chúng tôi có ngoại lệ ArrayIndexOutOfBounds trên hoạt động ArrayList.add(Object o)
. Lời giải thích rõ ràng nhất là an toàn luồng, nhưng tôi không thể tạo lại các sự kiện. Tôi đã thử tạo hai chủ đề. Trong một tôi đang thêm các yếu tố, trong khác tôi loại bỏ chúng (hoặc thanh toán bù trừ mảng), nhưng tôi đã không nhận được ngoại lệ cho lần thứ hai. Tôi có nghĩa là nó rõ ràng nó có thể xảy ra bằng cách nhìn vào nguồn của ArrayList, nhưng nó sẽ là tốt đẹp để có thể chứng minh nó.Làm thế nào để chứng minh arraylist không phải là thread an toàn với một bài kiểm tra?
Tôi đã chạy thử nghiệm này trong một thời gian khá mà không cần bất kỳ ngoại lệ:
public class Test {
static ArrayList a = new ArrayList();
public static void main(String[] args) throws Exception {
Thread t1 = new Thread() {
public void run() {
while (true) {
if (a.size() > 0)
a.remove(0);
}
}
};
Thread t2 = new Thread() {
public void run() {
while (true) {
a.add(new Object());
}
}
};
t2.start();
Thread.sleep(100);
t1.start();
}
}
'ArrayList.add (Object)' sẽ không ném một 'ArrayIndexOutOfBoundsException'; 'ArrayList.add (index, Object)' sẽ. –
guido: '' 'add (Object)' '' cũng có thể ném ngoại lệ (tôi đã nhìn thấy nó bằng chính mắt mình) nếu trạng thái bên trong của arraylist được thay đổi từ thread khác. Kiểm tra mã nguồn. – NeplatnyUdaj
yep you are right: http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/ArrayList.java#ArrayList.add%28java.lang .Object% 29; nó phải được đồng bộ bên ngoài –