В нашей заявке мы получили исключение ArrayIndexOutOfBounds в операции ArrayList.add(Object o)
. Наиболее очевидным объяснением является безопасность потоков, но я не смог воссоздать события. Я попытался создать два потока. В одном я добавляю элементы, а в другой я удаляю их (или очищая массив), но во второй раз я не получал исключение. Я имею в виду, что это может произойти, если посмотреть на источник 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: '' 'add (Object)' '' также может генерировать исключение (я видел это своими глазами), если внутреннее состояние arraylist изменено из другого потока. Проверьте исходный код. – NeplatnyUdaj
yep вы правы: http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/ArrayList.java#ArrayList.add%28java.lang .Object% 29; он должен быть синхронизирован в основном –