在我們的應用程序中,我們在ArrayList.add(Object o)
操作中得到了一個ArrayIndexOutOfBounds異常。最明顯的解釋是線程安全,但我無法重新創建事件。我試過創建兩個線程。在一個我添加元素,在另一個我刪除它們(或清除數組),但我沒有得到第二次例外。 我的意思是它很明顯可以通過查看ArrayList的來源發生,但能夠證明它是很好的。如何證明arraylist是不是線程安全的測試?
我一直在運行這個測試相當長一段時間沒有任何異常:
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)'不會拋出'ArrayIndexOutOfBoundsException'; 'ArrayList.add(index,Object)'會。 –
guido:如果arraylist的內部狀態從其他線程改變,那麼add(Object)'''也可以拋出異常(我親眼看到它)。檢查源代碼。 – NeplatnyUdaj
是的,你是對的:http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/ArrayList.java#ArrayList.add%28java.lang .Object%29;它必須在外部同步 –