potrzebne struktury ArrayList jak pozwalając tylko następujące operacjewspółbieżne ArrayList
get(int index)
add(E element)
set(int index, E element)
iterator()
ze względu na iteracyjnej wykorzystywane w wielu miejsc, używając Collections#synchronizedList
wo być podatnym na błędy. Lista może rozwinąć się do kilku tysięcy elementów i wiele się jej używa, więc jestem prawie pewna, że CopyOnWriteArrayList
będzie zbyt wolny. Zacznę od tego, aby uniknąć przedwczesnych optymalizacji, ale założę się, że to nie zadziała.
Najczęściej dostępnymi odczytami są jednowątkowe. Pytam więc, jaka jest właściwa struktura danych.
I mimo że owijanie synchronizedList
w coś zapewniając zsynchronizowane iterator zrobi, ale nie ze względu na ConcurrentModificationException
. Koncentrując się na współbieżnym zachowaniu, oczywiście potrzebuję, aby wszystkie zmiany były widoczne po kolejnych odczytach i iteratorach.
Iterator nie musi wyświetlać spójnej migawki, może aktualizować się lub nie przez set(int index, E element)
, ponieważ ta operacja zostanie użyta tylko w celu zastąpienia elementu jego zaktualizowaną wersją (zawierającą pewne dodatkowe informacje, które są nieistotne dla użytkownik iteratora). Przedmioty są w pełni niezmienne.
Wyjaśniłem wyraźnie, dlaczego nie zrobiłoby to CopyOnWriteArrayList
. ConcurrentLinkedQueue
nie wchodzi w grę, ponieważ nie ma dostępu indeksowanego. Potrzebuję tylko kilku operacji, a nie pełnowartościowego ArrayList
. Tak więc, chyba że każde pytanie związane z listą równoległą do java o numerze jest duplikatem this question, to nie jest.
Możesz wypróbować Clojure w [ 'PersistentVector'] (https://github.com/clojure/clojure/blob/master/src/jvm/ clojure/lang/PersistentVector.java), jest również kopiowaniem przy zapisie, ale nie naiwnym monolitycznym układem; raczej szerokie i płytkie drzewo tablic. Na końcu kodu źródłowego, do którego link się znajduje, znajdziesz kod testowy. –
@skaffman Czy możesz uprzejmie przeczytać pytanie przed jego zamknięciem? Zobacz moją aktualizację. – maaartinus
@MarkoTopolnik To by działało, ale kod wygląda bardzo dziwnie. Dodaje także trochę narzutów potrzebnych do operacji, na których mi nie zależy. Przy okazji, czy mógłbyś zagłosować na ponowne otwarcie? IMHO mod był nieco zbyt szybki przy czytaniu. – maaartinus