in

Sincronizado en Java – GeeksforGeeks

gfg 200x200 min

Los programas de subprocesos múltiples a menudo pueden llegar a una situación en la que varios subprocesos intentan acceder a los mismos recursos y finalmente producen resultados erróneos e imprevistos.

Por lo tanto, debe asegurarse mediante algún método de sincronización que solo un subproceso pueda acceder al recurso en un momento determinado.

Java proporciona una forma de crear subprocesos y sincronizar su tarea mediante el uso de bloques sincronizados. Los bloques sincronizados en Java se marcan con la palabra clave sincronizada. Un bloque sincronizado en Java se sincroniza en algún objeto. Todos los bloques sincronizados sincronizados en el mismo objeto solo pueden tener un hilo ejecutándose dentro de ellos a la vez. Todos los demás subprocesos que intentan ingresar al bloque sincronizado se bloquean hasta que el subproceso dentro del bloque sincronizado sale del bloque.

A continuación se muestra la forma general de un bloque sincronizado:

// Only one thread can execute at a time. 
// sync_object is a reference to an object
// whose lock associates with the monitor. 
// The code is said to be synchronized on
// the monitor object
synchronized(sync_object)
{
   // Access shared variables and other
   // shared resources
}

Esta sincronización se implementa en Java con un concepto llamado monitores. Solo un hilo puede poseer un monitor en un momento dado. Cuando un hilo adquiere un bloqueo, se dice que ha entrado en el monitor. Todos los demás subprocesos que intenten ingresar al monitor bloqueado serán suspendidos hasta que el primer subproceso salga del monitor.

A continuación se muestra un ejemplo de subprocesos múltiples con sincronización.

Java

import java.io.*;

import java.util.*;

class Sender

{

    public void send(String msg)

    {

        System.out.println("Sendingt" + msg );

        try

        {

            Thread.sleep(1000);

        }

        catch (Exception e)

        {

            System.out.println("Thread  interrupted.");

        }

        System.out.println("n" + msg + "Sent");

    }

}

class ThreadedSend extends Thread

{

    private String msg;

    Sender  sender;

    

    

    ThreadedSend(String m,  Sender obj)

    {

        msg = m;

        sender = obj;

    }

    public void run()

    {

        

        

        synchronized(sender)

        {

            

            sender.send(msg);

        }

    }

}

class SyncDemo

{

    public static void main(String args[])

    {

        Sender snd = new Sender();

        ThreadedSend S1 =

            new ThreadedSend( " Hi " , snd );

        ThreadedSend S2 =

            new ThreadedSend( " Bye " , snd );

        

        S1.start();

        S2.start();

        

        try

        {

            S1.join();

            S2.join();

        }

        catch(Exception e)

        {

            System.out.println("Interrupted");

        }

    }

}

Producción:

Sending     Hi 
Hi Sent

Sending     Bye 
Bye Sent

La salida es la misma cada vez que ejecutamos el programa.
En el ejemplo anterior, elegimos sincronizar el objeto Sender dentro del método run () de la clase ThreadedSend. Alternativamente, podríamos definir el todo el bloque send () sincronizado y produciría el mismo resultado. Entonces no tenemos que sincronizar el objeto Message dentro del método run () en la clase ThreadedSend.

Java

class Sender

{

    public synchronized void send(String msg)

    {

        System.out.println("Sendingt" + msg );

        try

        {

            Thread.sleep(1000);

        }

        catch (Exception e)

        {

            System.out.println("Thread interrupted.");

        }

        System.out.println("n" + msg + "Sent");

    }

}

No siempre tenemos que sincronizar un método completo. A veces es preferible sincronizar solo una parte de un método. Los bloques sincronizados de Java dentro de los métodos lo hacen posible.

Java

class Sender

{

    public void send(String msg)

    {

        synchronized(this)

        {

            System.out.println("Sendingt" + msg );

            try

            {

                Thread.sleep(1000);

            }

            catch (Exception e)

            {

                System.out.println("Thread interrupted.");

            }

            System.out.println("n" + msg + "Sent");

        }

    }

}

? list = PLqM7alHXFySEJYFqrpxG4eTbUAiX6jD0Y

Este artículo es una contribución de Souradeep Barua. Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema discutido anteriormente.

¡Atención lector! No dejes de aprender ahora. Hazte con todo lo importante Fundación Java y conceptos de colecciones con el Curso de Fundamentos de Java y Colecciones de Java a un precio asequible para los estudiantes y prepárese para la industria. Para completar su preparación desde el aprendizaje de un idioma hasta DS Algo y muchos más, consulte Curso completo de preparación para entrevistas.

Deja una respuesta

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

apple touch icon@2

c – 1 = falso y 0 = verdadero?

edit

Conductismo vs constructivismo: diferencia y comparación