thread termino saber resueltos programacion libro hilos fuente ejercicios ejemplos concurrente concurrencia componentes como codigo clase java concurrency

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:



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.