Wybór najlepszej listy współbieżności w Javie

Moja Pula wątków ma stałą liczbę wątków. Wątki te muszą często pisać i czytać z udostępnionej listy.

Więc, która struktura danych (lepiej lista, musi być wolna od monitorów) w java.util.concurrent pakiecie jest najlepsza w tym przypadku?

Author: rbento, 2011-11-20

6 answers

Had better be List

Tylko List implementacja w java.util.concurrent to CopyOnWriteArrayList. Istnieje również opcja zsynchronizowanej listy, jak wspomina Travis Webb.

To powiedział, jesteś pewien, że potrzebujesz to być List? Istnieje o wiele więcej opcji dla współbieżnych Queues I Map s (i możesz utworzyć SetS z Map s), a te struktury mają największy sens dla wielu rodzajów rzeczy, które chcesz zrobić ze współdzielonymi danymi struktura.

W przypadku kolejek masz ogromną liczbę opcji i która jest najbardziej odpowiednia zależy od tego, jak musisz z niej korzystać:

 61
Author: ColinD,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-20 19:26:16

Każda kolekcja Javy może być wykonana tak, aby była bezpieczna dla wątków:

List newList = Collections.synchronizedList(oldList);

Lub stworzyć zupełnie nowy wątek-bezpieczna Lista:

List newList = Collections.synchronizedList(new ArrayList());

Http://download.oracle.com/javase/6/docs/api/java/util/Collections.html#synchronizedList(java.util.List)

 38
Author: Travis Webb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-20 19:13:58

Jeśli rozmiar listy jest stały, możesz użyć AtomicReferenceArray . Pozwoli to na wykonywanie zindeksowanych aktualizacji do gniazda. W razie potrzeby możesz napisać widok listy.

 7
Author: Ben Manes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-20 21:25:40

Może warto spojrzeć na ConcurrentDoublyLinkedList napisany przez Douga Lea na podstawie "praktycznej listy Podwójnie połączonej bez blokady"Paula Martina. Nie implementuje Javy.util.Interfejs listy, ale oferuje większość metod, których można użyć na liście.

Według javadoc:

Równoległa implementacja linked-list Deque kolejki). Jednoczesne wstawianie, usuwanie i dostęp operacje wykonywane są bezpiecznie w wielu wątkach. Iteratorami są słabo spójne , zwracające elementy odzwierciedlające stan deque w pewnym momencie lub od utworzenia iteratora. Oni do Nie rzucać ConcurrentModificationException i może Kontynuuj jednocześnie z innymi operacjami.

 5
Author: shams,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-20 19:36:05

ConcurrentLinkedQueue używa kolejki bez blokady (bazującej na nowszej instrukcji CAS ).

 3
Author: eSniff,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-20 19:08:40

Jeśli zestaw jest wystarczający, można użyć ConcurrentSkipListSet . (Jego implementacja opiera się na ConcurrentSkipListMap, która implementuje listę pominięć.)

Oczekiwany średni koszt czasu to log(N) dla operacji contains, add, and remove; metoda size nie jest operacją w czasie stałym.

 1
Author: anre,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-04 15:28:06