8 Concurrent-aware collections¶
Introducción¶
Las colecciones thread-safe que vamos a estudiar a continuación se basan en el algoritmo de Michael & Scott algorithm para colas no bloqueantes sin cerrojos (non blocking lock-free queues).
Estas colecciones NO proporcionan un modo bloqueante, dado que emplea un algoritmo no bloqueante muy eficiente. Por este motivo, estas clases no implementan la interfaz BlockingQueue
o BlockingDequeue
, y no proporcionan los métodos bloqueantes incluidos en ellas.
Por tanto su uso no está recomendado en escenarios en los que los productores deban bloquearse esperando a consumidores o viceversa, ya que no podrán hacerlo.
Debemos tener en cuenta que los iteradores creados para recorrer estas colecciones son débilmente consistentes, devolviendo elementos que reflejan el estado de la colección en algún momento desde la creación del iterador. No lanzan la excepción ConcurrentModificationException
, y pueden funcionar concurrentemente con otras operaciones. Los elementos contenidos en la colección desde la creación del iterador serán devueltos exactamente una vez.
Otro aspecto que debemos vigilar es que, a diferencia de en la mayoría de las colecciones, y debido a la naturaleza asincrónica de estas colas, la determinación del número actual de elementos requiere una travesía de los elementos, y por lo tanto el método size()
puede devolver resultados inexactos si esta colección se modifica durante el recorrido para calcular el tamaño.
Al igual que en otras colecciones concurrentes, se asegura que si concurrentemente un hilo está agregando un objeto a la colección y otro lo está accediendo o eliminando, esta segunda operación se realizará después de la de inserción.
Estas colecciones tampoco permite insertar en ella valores null
, al igual de todas las colecciones concurrentes vistas anteriormente.
Para saber más
https://www.codejava.net/java-core/collections/understanding-collections-and-thread-safety-in-java
ConcurrentLinkedQueue¶
La clase ConcurrentLinkedQueue
proporciona una estructura de datos en forma de cola FIFO thread-safe, sin limitación de capacidad, en la que los elementos son nodos enlazados.
A diferencia de LinkedBlockingQueue
, la clase ConcurrentLinkedQueue
NO proporcionan un modo bloqueante.
En la siguiente tablas se muestran las operaciones principales y sus métodos:
Método | |
---|---|
Inserción | add(e) |
Eliminación | remove() |
Consulta | element() |
Esta colección tampoco permite insertar en ella valores null
, al igual de todas las colecciones concurrentes vistas anteriormente.
ConcurrentLinkedDequeue¶
La clase ConcurrentLinkedQueue
proporciona una estructura de datos en forma de cola FIFO y LIFO thread-safe, sin limitación de capacidad, en la que los elementos son nodos enlazados.
A diferencia de LinkedBlockingDequeue
, la clase ConcurrentLinkedDequeue
NO proporciona un modo bloqueante.
En la siguiente tabla se muestran las operaciones principales y sus métodos:
Extremo head | Extremo tail | |
---|---|---|
Inserción | addFirst(e) | addLast(e) |
Eliminación | removeFirst(e) | removeFirst(e) |
Consulta | getFirst() | getLast() |
Esta colección tampoco permite insertar en ella valores null
, al igual de todas las colecciones concurrentes vistas anteriormente.