2013-03-15 15 views

Odpowiedz

9

Nie można modyfikować Vector podczas iteracji nad nim. Przechowuj elementy, aby dodać je w oddzielnym wektorze, i przenieś je do wektora po zakończeniu pętli lub zapętlaj kopię oryginalnego wektora.

DODANO: Aby uzyskać muteksu wokół Vector w języku Java, zrób to w obu tych funkcjach:

synchronized (list) { 
    // modifying list 
} 

i:

synchronized (list) { 
    // iterating over list 
} 

Oczywiście mam przyjąć, że lista jest nazwany list

+3

Uwaga boczna: obowiązuje nawet w programach jednowątkowych. – svckr

+0

Masz rację: – fredrik

+0

co masz na myśli, mówiąc, że ma to zastosowanie w programach jednowątkowych? – Shelef

2

Jeśli chcesz dodawać elementy podczas iteracji, będziesz potrzebował użyć ListIterator. używając Vector, nie omijasz tej reguły (oczywiście), więc polecam zamiast tego używać ArrayList.

+0

Nie sądzę, że jest bezpiecznie dodawać podczas iteracji z ListIterator, jeśli zaangażowany jest więcej niż jeden wątek. – assylias

+1

@assylias, źle zrozumiałem pytanie, jak przypuszczam. Właśnie zwracałem się do 'ConcurrentModificationException'. – mre

0

Jeśli potrzebujesz powtórzyć i dodać jednocześnie do listy, powinieneś użyć listy współbieżnej, takiej jak CopyOnWriteArrayList. Zauważ, że jeśli napiszesz dużo do listy, nie będzie to zbyt efektywne.

W przeciwnym razie, jeśli używasz Vector lub synchronizedList, musisz trzymać blokadę listy podczas iteracji. To zapobiegnie wyjątkowi, ale zapobiegnie także współbieżności ...

Powiązane problemy