HEADER_lecciones_de_software

Programación concurrente: Parte 2

por Nicolás Archila Gómez, el 23 de junio de 2022


IMAGEN LECCIONES FONDO

En esta segunda parte aprenderemos a simplificar la sincronización de hilos en Java, mejorando el código que se viene trabajando en la parte 1.

Si quieres continuar aprendiendo de concurrencia, te recomendamos visitar la parte 3.

Cómo simplificar la sincronización de hilos en Java

Hay una manera más sencilla de sincronizar los métodos y es usando sincronized en el método para automáticamente bloquearlo cuando un hilo lo ejecuta sin necesidad de hacer un lock() explícito, y se puede usar wait() extendiendo de la clase object de java para poner el hilo en espera como lo hicimos en el caso anterior con Await(). Finalmente, se pueden despertar los hilos en espera con notifyAll en vez de usar signalAll(); pero, es importante tener en cuenta que el método wait() sólo se puede usar una vez y por tal razón solo permitiría una condición para poner en espera el hilo en ejecución. Si se requieren más condiciones, se debe usar ReentrantLock y usar los bloqueos, desbloqueos y espera de manera explícita cómo lo hicimos anteriormente. Veamos ahora un ejemplo del esquema sincronized:

Removemos la condición signalAll y todo lo relacionado a lock y solamente colocamos sincronized en el método para sincronizar los hilos y adicionalmente usamos wait() de la clase object para pausar un hilo y notifyAll() de la clase object para despertar todos los hilos.

package com.thread.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DemoApplication {

	public static void main(String[] args) {
		SpringApplication.run(DemoApplication.class, args);
		AccountOperation accountOperation = new AccountOperation();
		long sourceValue = 1;
		long targetValue = 1;
		Account sourceAccount = new Account(sourceValue,"Cuenta Origen",null,accountOperation);
		Account targetAccount = new Account(targetValue,"Cuenta Destino",sourceAccount,accountOperation);
		sourceAccount.start();
		targetAccount.start();
	}

}


Este método lo colocamos en una nueva clase llamada AccountOperation.

package com.thread.demo;

import java.util.concurrent.locks.Lock;

public class AccountOperation{
	
	protected synchronized void operation(Account account) {
		Account sourceAccount;
		sourceAccount = account.anotherAccount;

		StringBuilder text = new StringBuilder();
		if(account.anotherAccount == null) {
			text.append("Hilo en espera de ").append(account.name);
			System.out.println(text.toString());
			try {
				wait();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		for(int count=0; count <= 5;count++) {
			text.setLength(0);
			text.append("Valor del hilo ");
			account.value = account.value+100;
			text.append(account.name).append(" es ").append(account.value);
			System.out.println(text.toString());
		}
		text.setLength(0);
		text.append("Valor final del hilo ").append(account.name).append(" es ").append(account.value);
		System.out.println(text.toString());
		sourceAccount.anotherAccount = account;
		notifyAll();
		System.out.println("Despertar hilos");
	}

}


Y obtenemos el mismo resultado:

Hilo en espera de Cuenta Origen
Valor del hilo Cuenta Destino es 101
Valor del hilo Cuenta Destino es 201
Valor del hilo Cuenta Destino es 301
Valor del hilo Cuenta Destino es 401
Valor del hilo Cuenta Destino es 501
Valor del hilo Cuenta Destino es 601
Valor final del hilo Cuenta Destino es 601
Despertar hilos
Desbloquea el hilo
Valor del hilo Cuenta Origen es 101
Valor del hilo Cuenta Origen es 201
Valor del hilo Cuenta Origen es 301
Valor del hilo Cuenta Origen es 401
Valor del hilo Cuenta Origen es 501
Valor del hilo Cuenta Origen es 601
Valor final del hilo Cuenta Origen es 601

Ahora que has simplificado la sincronización de hilos en Java, es momento de que aprendas acerca de cómo incorporar el paralelismo en la concurrencia.

Guía para crear una aplicación serverless en 4 pasos

Temas:Desarrollo de Software

Lecciones Pragma

Lecciones en Academia Pragma

Aquí encontrarás tutoriales técnicos para que apliques en temas de desarrollo de software, cloud, calidad en software y aplicaciones móviles. 

También puedes visitar nuestro Blog con contenido actual sobre Transformación Digital, Marketing, Conocimiento de Usuario y más. 

Blog

Suscríbete a la academia

Descarga la Guía para trabajar con ambientes IBM Websphere Portal