W naszej aplikacji otrzymaliśmy wyjątek ArrayIndexOutOfBounds w operacji ArrayList.add(Object o)
. Najbardziej oczywistym wytłumaczeniem jest bezpieczeństwo wątków, ale nie byłem w stanie odtworzyć zdarzeń. Próbowałem utworzyć dwa wątki. W jednym dodaję elementy, w drugim usuwam je (lub czyszczę tablicę), ale nie dostałem wyjątku po raz drugi. Mam na myśli to, że może się zdarzyć, patrząc na źródło ArrayList, ale byłoby miło móc to zademonstrować.Jak udowodnić, że lista kontrolna nie jest bezpieczna dla wątków za pomocą testu?
ja już działa ten test od dłuższego czasu bez wyjątku:
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)' nie rzuci 'ArrayIndexOutOfBoundsException'; "ArrayList.add (index, Object)' będzie. –
guido: '' 'add (Object)' '' może również wyrzucić wyjątek (widziałem to na własne oczy), jeśli stan wewnętrzny listy jest zmieniony z innego wątku. Sprawdź kod źródłowy. – NeplatnyUdaj
Tak, masz prawo: http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/ArrayList.java#ArrayList.add%28java.lang .Object% 29; musi być zsynchronizowany externally –