Enhebrar Sincronización en Java con el Ejemplo

En este artículo, vamos a aprender acerca de la sincronización de hilos ? Explicando través de un ejemplo con y sin sincronización de subprocesos .

En la programación multiproceso, múltiples hilos se ejecutan simultáneamente y acceso a recursos comunes. Para evitar estancamiento, debemos asegurarnos de que un recurso debe ser compartida por un hilo a la vez o de lo contrario puede producir un resultado raro o imprevisto. Este proceso se conoce como la sincronización. En este artículo, vamos a discutir la forma de lograr la sincronización de hilos en Java ?

Vamos a entender esto tomando un ejemplo. Hay dos hilos que están accediendo y escritura a salida.txt archivo común. Si no se utiliza la sincronización a continuación, un hilo escribe unas palabras en el archivo y, mientras tanto otro hilo empieza a escribir en el fichero. El archivo resultante contendrá contenidos aleatorios escritos por los dos hilos. Con la sincronización, si un hilo está escribiendo en el archivo, el archivo será bloqueado (en el modo LOCK) y ningún otro proceso o subproceso puede acceder a él hasta el primer hilo completó su trabajo.

Considere el código, sin sincronización,

class print{
public void printMSG(String s){
for(int i=1;i<=5;i++) {
System.out.println(s);
try {
Thread.sleep(1000); // used to sleep current execution for 1s
} catch (Exception e) {
System.out.println(e);
}
}
}
}
class one extends Thread{
print t;
one(print t){
this.t=t;
}
public void run(){
t.printMSG("Hi");
}
}
class two extends Thread{
print t;
two(print t){
this.t=t;
}
public void run() {
t.printMSG("Bye");
}
}
public class ExSynchronization {
public static void main(String[] args) {
print t=new print();
one ob=new one(t);
two o2=new two(t);
ob.start();
o2.start();
}
}

salida

Hi
Bye
Bye
Hi
Hi
Bye
Hi
Bye
Hi
Bye

Nota: Esta salida es al azar.

En este programa, se han diseñado dos hilo que está accediendo a una función común printMSG () . Cuando ejecutamos este código, podemos obtener el resultado deseado como se ha visto anteriormente.

Para sincronizar la salida usaremos método class. Esto bloqueará el objeto class un recurso compartido. Podemos hacer esto mediante la adición de palabras clave synchronized al método compartido.

Veamos el código for continuación,

class print{
synchronized public void printMSG(String s){
for(int i=1;i<=5;i++) {
System.out.println(s);
try {
Thread.sleep(1000); // used to sleep current execution for 1s
} catch (Exception e) {
System.out.println(e);
}
}
}
}
class one extends Thread{
print t;
one(print t){
this.t=t;
}
public void run(){
t.printMSG("Hi");
}
}
class two extends Thread{
print t;
two(print t){
this.t=t;
}
public void run() {
t.printMSG("Bye");
}
}
public class ExSynchronization {
public static void main(String[] args) {
print t=new print();
one ob=new one(t);
two o2=new two(t);
ob.start();
o2.start();
}
}

salida

Hi
Hi
Hi
Hi
Hi
Bye
Bye
Bye
Bye
Bye

Nota: Los hilos pueden comenzar en cualquier orden.


Deja un comentario

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