viernes, 1 de mayo de 2020

Java - Hilos Sincronizados


Existen varias formas en las que podemos sincronizar los hilos en Java y poder logar que los datos generados estén correctos. La idea de sincronizar los hilos es que estos puedan utilizar los recursos compartidos de una forma ordenada y correcta.

Para este ejemplo utilizaremos ReentrantLock como objeto para bloquear los accesos ordenados de los hilos.

Lo que vamos hacer es un ejemplo muy simple que nos permite ejecutar dos hilos. Cada uno de los hilos va a restar números de una sola variable. Si esto lo hacemos sin la sincronización los resultados pueden ser erróneos. Por lo que vamos a sincronizarlos.

Lo primero que debemos hacer es crear un proyecto. Dentro de este proyecto de java vamos a crear una clase llamada Utils. Esta clase solo va a tener una variable estática que nos permite almacenar en momería un monto. El monto que utilizaremos es de 100.

Ahora lo que tenemos que agregar es una clase llamada SumThread. Dentro de esta clase agregaremos el código de bloqueo y la operación para restar las cantidades a la variable total.

Dentro del método run creamos un ciclo que recorre un arreglo llamado numbers, el cual contiene 3 números que son los que se restaran al valor total de 100.

Como podemos observar en el método run antes de hacer cualquier operación sobre la variable que deseamos proteger con la sincronización hacemos uso de un objeto llamado lock. Este objeto lock lo inicializamos en el Main y lo pasamos por medio del constructor de la clase. Este objeto cuanta con un método llamado lock que nos permite bloquear los recursos hasta que ya no estén en uso. (esto lo podemos ver en la línea 23)

El objeto lock es declarado en la línea 9 y para que este pueda funcionar correctamente lo tenemos que asignar en la línea 14 dentro del constructor de la clase usando el objeto lock que viene de la línea 12.

Todo el código que se encuentra entre la línea 24 y 31 son las operaciones que deseamos realizar sobre la variable total.

Cuando terminamos de utilizar la variable estática total debemos liberar el recurso utilizando el método unlock. De esta manera podemos permitir otros hilos utilizar esta variable.  (Esto lo podemos ver en la línea 34)

Ahora en la clase Main vamos a poner a correr nuestra aplicación. Lo primero es crear el objeto lock que vamos a pasar a los hilos (Esto está en la línea 15). Este objeto es de tipo ReentrantLock que viene del paquete concurrent de java (esto lo podemos ver en la línea 3).

Cada vez que inicializamos un hilo debemos pasar el objeto lock como podemos observar en la línea 19 y 20.

Ejemplo



Etiquetas: , , , ,

0 comentarios:

Publicar un comentario

Suscribirse a Enviar comentarios [Atom]

<< Inicio