Java Concurrencia : Mutual Exclusion Locks (BlockingQueue)

Hola chavos, en esta ocasion les voy a empezar a compartir un poco de lo que estoy aprendiendo en mi especialidad, Sistemas Concurrentes con Java, Les voy a mostrar los distintos metodos y clases a usar,, empezare con un poco de teoría y al final podrán ver un link a mi Github donde verán un pequeño ejemplo de cada método, por lo pronto hoy empezare con Java Reentrantlock!

Java Reentrantlock es una clase usada en java para manejar la concurrencia. El uso de esta clase se da en módulos críticos, solo un hilo puede acceder a dicho modulo critico, para entender esto mejor utilizaremos el ejemplo del baño de un avión:

"Solo una persona puede estar usando el baño a la vez, si el baño se encuentra vacante entonces solo UNA persona puede entrar, cuando la persona entra al baño su estado cambia a ocupado, y mientras el baño se encuentre ocupado las demás personas deben de esperar; finalmente cuando la persona sale del baño el baño cambia de ocupado a vacante y ahora otra persona que se encontraba esperando puede entrar"

Reentrantlock usa el patrón Bridge, el cual básicamente esta basado en el siguiente esquema:


Como podemos ver la clase Abstracción es meramente un intermediario (un puente), es decir, el cliente solo ve la Clase Abstracción, lo que haga la clase o deje de hacer al cliente no le importa, tomando el ejemplo del baño de un avión, la persona solo ve el baño, lo que este haciendo o no la otra persona dentro de el, no nos importa. Si desean saber mas de este patrón pueden ver este post, el cual me ayudo para entenderlo mejor.

La implementación de este constructor requiere de 1 parámetro tipo boolean, el cual nos servirá como el candado del "baño", si es verdadero, entonces el "baño" se encuentra vacante y se le da acceso al hilo con mas espera en la fila, de lo contrario se le negara el acceso, es decir, el "baño" se encuentra ocupado.

El uso de Reentrantlocks puede ser tedioso y propenso a errores, debido a:
  • Asegurar el modulo con su debido lock pero nunca lo desaseguramos
  •  Desasegurar un modulo que nunca fue asegurado
  • Asegurar un modulo por un largo tiempo
  • Acceder a los recursos de un modulo sin asegurarlo primero

//Java Reentrantlock en Android

Android maneja esta tipo de concurrencia con la clase BlockingQueue y cualquiera de sus hijos (ArrayBlockingQueue, LinkedBlockingQueue, etc.). Esta clase trabaja de la siguiente manera:

"Una vez que un hilo accede al modulo critico, checa primero si tiene un lock, si este no tiene un lock o seguro, entonces el hilo accede, por lo contrario el hilo se dormirá hasta que este lock desaparezca"

Esta clase utiliza la clase Reentrantlock para proteger la información en caso de extrañas condiciones y para asegurar que la lectura y escritura por diferentes hilos sea propagado correctamente a través de la memoria.

Para ver un ejemplo practico de este tipo de concurrencia, puede ir a mi Github para verlo.

Por ahora sera todo, en un futuro estaré posteando mas acerca de la concurrencia en java, espero y esto les sirva parasus proyectos, por lo pronto me despido, adios ^_^/

Comments

Popular posts from this blog

Juego de Gato Usando HTML, JavaScript y CSS

AfterEffects - Quitar el Fondo de un Video Forma 1: KeyLight

Crear un nuevo Libro de Excel con VBA ES