Mój program ma wątek renderujący OpenGL i wątek modyfikacji danych. Wątek renderujący uzyskuje dostęp do danych w grupie obiektów ArrayLists, a wątek modyfikacji danych zmienia, usuwa i dodaje obiekty do ArrayLists. Wątki aktualizują się około 60 razy na sekundę, a manipulowanie ArrayList jest wąskim gardłem programu. Próbowałem zsynchronizować bloki (super powolny), CopyOnWriteArrayLists (dość powolny) i tworzenie bufora ArrayLists w wątku renderowania (mniejszy z trzech zła). Jaki jest "najlepszy" sposób na uzyskanie maksymalnej wydajności z równoległych ArrayLists?Java - Jaki jest najbardziej skuteczny sposób synchronizowania ArrayList?
Odpowiedz
Najlepszym mechanizmem jest wykonanie pracy w wątku GL i operacje kolejki do wykonania. Jeśli istnieje tylko jeden wątek uzyskujący dostęp do listy, nie ma problemu.
Dlaczego najlepiej jest przenieść logikę programu do wątku gl? –
Głupisz ze stanem GL. Cały stan "mucking-about-with" powinien odbywać się w wątku GL. Proste. –
Właśnie zacząłem programować GL około 3 dni temu. Przeczytam o stanach GL. Ale nawet kiedy program był Java Swing, istota problemu pozostaje taka sama, nie? Nie chciałem, aby było to pytanie specyficzne dla GL. –
List<YourObject> syncList = Collections.synchronizedList(yourList);
Jestem bardzo zmęczony tym rozwiązaniem. Przede wszystkim kolekcja musi być zsynchronizowana ręcznie, gdy używany jest iterator, i mogą istnieć inne problemy. Myślę, że to jest problem z logiką programu. –
Daje to kompleksowe rozwiązanie typu "wszystko albo nic", gdzie jako pytanie o próbę uzyskania większej ziarnistości blokowania – Yoni
-1 To nie odpowiada w ogóle na pytanie. W rzeczywistości użycie Collection.synchronized * jest zawsze najtańszym, najbardziej nieefektywnym i często niepoprawnym sposobem synchronizacji w kolekcji. Choć czasami może "wykonać swoją robotę", dobrze jest jej używać tylko wtedy, gdy praca nie ma większego znaczenia. –
Musisz opowiedzieć więcej o algorytmie i topologii "gromady ArrayLists". – jmg
Czy rozważałeś zastosowanie "ConcurrentHashMap" lub "ConcurrentSkipListMap/Set"? –
spojrzałeś na pakiet java.util.concurrent jako alternatywę dla synchronizacji bloków? – Yoni