termino - hilos en java ejemplos resueltos
Elegir la mejor lista de concurrencia en Java (6)
Mi grupo de hilos tiene un número fijo de hilos. Estos hilos necesitan escribir y leer de una lista compartida con frecuencia.
Entonces, ¿qué estructura de datos (mejor que sea una lista, debe estar libre de monitores) en el paquete java.util.concurrent
es la mejor en este caso?
mejor que sea
List
La única implementación de la List
en java.util.concurrent
es CopyOnWriteArrayList . También existe la opción de una lista sincronizada como menciona Travis Webb.
Dicho esto, ¿estás seguro de que necesitas que sea una List
? Hay muchas más opciones para las Queue
y los Map
concurrentes (y puede hacer Set
desde los Map
), y esas estructuras tienden a tener más sentido para muchos de los tipos de cosas que desea hacer con una estructura de datos compartida. .
Para las colas, tiene una gran cantidad de opciones y la que es más apropiada depende de cómo necesite usarla:
Cualquier colección de Java se puede hacer para que sea segura para subprocesos de la siguiente manera:
List newList = Collections.synchronizedList(oldList);
O para crear una nueva lista segura para subprocesos:
List newList = Collections.synchronizedList(new ArrayList());
Es posible que desee consultar la Lista ConcurrentDoublyLinkedList escrita por Doug Lea basada en la "Lista práctica de un doble enlace sin bloqueo" de Paul Martin. No implementa la interfaz java.util.List, pero ofrece la mayoría de los métodos que usaría en una Lista.
Según el javadoc:
Una implementación concurrente de listas vinculadas de un Deque (cola de doble finalización). Las operaciones simultáneas de inserción, eliminación y acceso se ejecutan de forma segura en varios subprocesos. Los iteradores son débilmente consistentes , devolviendo elementos que reflejan el estado del deque en algún momento en o desde la creación del iterador. No lanzan ConcurrentModificationException, y pueden proceder simultáneamente con otras operaciones.
Si el conjunto es suficiente, se puede usar ConcurrentSkipListSet . (Su implementación se basa en ConcurrentSkipListMap que implementa una lista de omisión ).
El costo de tiempo promedio esperado es log (n) para las operaciones de contener, agregar y eliminar; El método del tamaño no es una operación de tiempo constante.
Si el tamaño de la lista es fijo, puede usar un AtomicReferenceArray . Esto le permitiría realizar actualizaciones indexadas en una ranura. Podría escribir una vista de lista si es necesario.
ConcurrentLinkedQueue
usa una cola sin bloqueo (basada en la instrucción CAS más reciente).