Używam Vector
zamiast ArrayList
, aby lista była bezpieczna w środowisku wielowątkowym. Ale wciąż otrzymuję ConcurrentModificationException
, gdy próbuję dodać elementy do Vector
podczas iteracji go. Dlaczego tak jest i jak mogę temu zapobiec?Użyłem zsynchronizowanej listy i nadal otrzymuję ConcurrentModificationException
Odpowiedz
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
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
.
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 ...
- 1. ConcurrentModificationException podczas usuwania listy podrzędnej
- 2. Java ConcurrentModificationException
- 3. Unikanie TreeMap ConcurrentModificationException?
- 4. Lista wyrzuca ConcurrentModificationException, ale zestaw nie generuje ConcurrentModificationException?
- 5. Wywołanie zsynchronizowanej metody z metody zsynchronizowanej, obu tego samego obiektu.
- 6. ConcurrentModificationException dla ArrayList
- 7. Dlaczego Iterator.next() wyrzuca ConcurrentModificationException
- 8. Nie rzuca wyjątku ConcurrentModificationException
- 9. ConcurrentModificationException z LinkedHashMap
- 10. Kompilacja TypeScript dobrze, ale nadal otrzymuję błędy intellisense
- 11. Tekst do obrazu, nadal otrzymuję błąd "nie zdefiniowano obrazów"
- 12. Dlaczego otrzymuję OutOfMemory, gdy 20% sterty jest nadal za darmo?
- 13. Microsoft.Owin.Host.SystemWeb i nadal otrzymuję Brak elementu owin.Environment został znaleziony w kontekście
- 14. Zmiana obiektu blokowania w zsynchronizowanej sekcji @
- 15. ERROR errors.GrailsExceptionResolver - ConcurrentModificationException wystąpił podczas przetwarzania żądania:
- 16. Dlaczego ten kod nie generuje wyjątku ConcurrentModificationException?
- 17. Tworzenie stylowej listy wyboru, która nadal korzysta z funkcji iOS.
- 18. ConcurrentModificationException podczas używania strumienia z zestawem kluczy Maps
- 19. Nie można uzyskać sesji zsynchronizowanej z transakcją dla bieżącego wątku
- 20. Tablica do rozdzielanego przecinkiem łańcucha i do ostatniego tagu użyłem 'i' zamiast przecinka w jquery
- 21. nadal otrzymuję plik <Cordova/CDVViewController.h> nie znaleziono błędu w kodzie xcode
- 22. Nie mogę przekonać PHPMyAdmina do rozpoznania pliku konfiguracyjnego po aktualizacji (nadal otrzymuję zbyt krótki błąd blowfish)
- 23. Jak sprawdzić, ile wątków oczekuje na odblokowanie zsynchronizowanej metody?
- 24. Jak dokonać IvParameterSpec losowego, ale nadal odszyfrować
- 25. Zmieniono AllowOverride dla wszystkich i nadal nic
- 26. Czy można bezpiecznie wywołać zsynchronizowaną metodę z innej zsynchronizowanej metody?
- 27. Jak zmienia się Mercurial, gdy już użyłem klonu hg?
- 28. FB jest niezdefiniowany, mimo że właśnie go użyłem
- 29. Czy google.loader.clientlocation nadal obsługiwane
- 30. ConcurrentModificationException w systemie Android podczas uzyskiwania dostępu do wspólnych preferencji
równoczesna! = Równoległa. Możesz uzyskać wyjątek ConcurrentModificationException z jednym wątkiem. –