Nella nostra applicazione abbiamo ottenuto un'eccezione ArrayIndexOutOfBounds sull'operazione ArrayList.add(Object o)
. La spiegazione più ovvia è la sicurezza del thread, ma non sono stato in grado di ricreare gli eventi. Ho provato a creare due thread. In uno sto aggiungendo elementi, nell'altro li sto rimuovendo (o cancellando l'array), ma non ho ottenuto l'eccezione per la seconda volta. Voglio dire, è ovvio che può succedere guardando la fonte di ArrayList, ma sarebbe bello poterlo dimostrare.Come dimostrare che l'arraylist non è thread-safe con un test?
Ho corso questa prova per un bel po 'di tempo, senza alcuna eccezione:
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)' non getterà 'ArrayIndexOutOfBoundsException'; 'Will ArrayList.add (index, Object)'. –
guido: '' 'add (Object)' '' può lanciare anche l'eccezione (l'ho vista con i miei occhi) se lo stato interno dell'arrayylist è cambiato da altro thread. Controlla il codice sorgente. – NeplatnyUdaj
sì hai ragione: http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/ArrayList.java#ArrayList.add%28java.lang .Oggetto% 29; deve essere sincronizzato esternamente –