En el siguiente artículo, presentaremos un algoritmo para un trabajar una Cola en forma concurrente que soporta un lector y múltiples hilos de escritura. Los hilos de escritura solo necesitan leer desde un campo local que sea un hilo y escribir en un atributo volatile para publicar el evento en la Cola. La escritura no necesita “comparar y cambiar” operaciones como las colas concurrentes estandard del JDK, permitiendo un algoritmo fácil y rápido. Un ejemplo de uso es un hilo escribiendo en un archivo de eventos en forma asíncrona.

Escritura

La idea principal es no utilizar una simple Cola, sino muchas. Utilizamos una Cola por hilo de escritura almacenada en un campo local. A continuación, la Cola es una lista vinculada simple que utiliza un campo volatile para el siguiente elemento y un tipo final para el valor:

Escribir un elemento en la cola se implementa en el método accept. Cuando se escribe el primer elemento, lastWritten y lastRead se establecerán en el nuevo LinkedListElement. De lo contrario, la lista se amplia con el nuevo LinkedListElement, y lastWritten se mueve al final de la lista.

Y aquí esta la clase que almacena cada cola, llamada Consumer, en un campo thread local:

Lectura

Cuando se leen los elementos, se requiere recordar el último elemento a leer. Esto lo hacemos en el campo lastRead en LinkedList. A continuación el método de lectura utilizado para leer los elementos de una cola:

A continuación la clase ListElementPointer utilizado para almacenar el último elemento de lectura:

El atributo lastRead es inicializado por el hilo de escritura y, luego, solo se modifica mediante el hilo de lectura.

En este artículo no se muestra el código para crear nuevas listas enlazadas y leer múltiples listas enlazadas en el hilo de lectura. Puede ver el código ejemplo completo.

Uso

La cola es de código abierto y el código esta disponible en GitHub. Una aplicación de este algoritmo es VMLens, una herramienta que detecta errores del tipo race conditions y deadlocks en una aplicación Java. VMLens hace un seguimiento a la aplicación y escribe los eventos en forma asíncrona, utilizando esta Cola, en un archivo para posteriores análisis.


Este artículo esta basado en An Algorithm for a Concurrent Queue

Java: un algoritmo para una Queue concurrente
Si te gusto, comparte ...Email this to someone
email
Share on Facebook
Facebook
Tweet about this on Twitter
Twitter
Share on LinkedIn
Linkedin
Share on Google+
Google+
Etiquetado en:    

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Facebook
A %d blogueros les gusta esto: