2010-10-12 6 views
7

wszystkich,CopyOnWriteArray lub Vector

Krawędź wektora klasa ma na ArrayList jest to, że jest on synchronizowany i tym samym zapewnia wątku bezpieczeństwa. Jednak pomiędzy CopyOnWriteArray i Vector, co powinno być preferowane, biorąc pod uwagę bezpieczeństwo i wydajność wątku.

Odpowiedz

8

Ogólnie, zależy to od częstotliwości i charakteru operacji odczytu i zapisu oraz wielkości tablicy.

Musisz odniesienia w swoim kontekście, aby upewnić się, ale tutaj są pewne ogólne zasady:

  • Jeśli jesteś tylko będzie czytać tablicę , wtedy nawet ArrayList jest wątek bezpieczny (ponieważ jedynymi modyfikacjami, które nie wymagają gwintowania są , które modyfikują listę). Stąd chcesz użyć niezsynchronizowanej struktury danych , albo ArrayList lub CopyOnWriteArrayList będzie prawdopodobnie działać równie dobrze.
  • Jeśli czyta są znacznie bardziej powszechne porównaniu do zapisów to byś mają tendencję do preferowania CopyOnWriteArrayList, od napowietrznej kopiowanie tablica jest tylko poniesione na zapisy.
  • Jeśli rozmiar tablicy jest mały, to koszt wykonania kopie tablic będzie również mała, stąd ten będzie sprzyjał CopyOnWriteArrayList nad Vector.

Można również rozważyć dwie inne opcje:

  • Wykorzystanie ArrayList ale zadane synchronizację gdzie indziej w celu zapewnienia bezpieczeństwa wątku. Jest to metoda, z której korzystam najczęściej - w zasadzie chodzi o to, aby używać osobnego blokady na wyższym poziomie, aby chronić wszystkie odpowiednie struktury danych w tym samym czasie. Jest to o wiele bardziej wydajne niż synchronizacja każdej operacji w trybie Vector.
  • Zastanów się, czy jest niezmienny persistent data structure - są one gwarantowane jako bezpieczne dla wątków ze względu na niezmienność, nie wymagają synchronizacji, a także czerpią korzyści z niskiego narzutu (tj. Dzielą większość danych pomiędzy różnymi instancjami, zamiast wykonywać kompletne nowe kopie). Języki takie jak Clojure używają ich do uzyskania wydajności podobnej do ArrayList, a jednocześnie gwarantują pełne bezpieczeństwo wątków.
+0

Ponadto, należy rozważyć użycie Collections.synchronizedList zawinąć Lista zakaz wątek bezpieczny, zamiast robić synchronizacje zewnętrznych – barjak

+0

„użyć osobnego, blokada na wyższym poziomie ... To jest o wiele bardziej wydajny ** ** niż synchronizacja przy każdej operacji "-> Wygodna może być, ale wydajna? Myślę, że blokada na wyższym poziomie jest dokładnie odwrotna niż efektywna. – Kashyap

+0

"użyj oddzielnej blokady na wyższym poziomie ... Jest to znacznie bardziej ** efektywne ** niż synchronizacja przy każdej pojedynczej operacji" -> Może być wygodna, ale wydajna? Myślę, że blokada na wyższym poziomie jest dokładnie odwrotna niż efektywna. – Kashyap

7

To zależy od sposobu użycia - jeśli masz dużo więcej czyta niż pisze, użyj CopyOnWriteArrayList, w przeciwnym razie użyj Vector.

wprowadza małe opóźnienie synchronizacji dla każdej operacji, gdy CopyOnWriteArrayList ma dłuższe opóźnienie zapisu (z powodu kopiowania), ale brak opóźnień dla odczytów.

Innym zagadnieniem jest zachowanie iteratorów - Vector wymaga jawnej synchronizacji podczas iteracji (więc operacje zapisu nie mogą być wykonywane w tym samym czasie), CopyOnWriteArrayList nie.