Sincronización estática en Java

La sincronización es el potencial para regular el acceso de múltiples hilos a cualquier recurso compartido. La sincronización en Java es esencial para una comunicación confiable entre hilos. Se logra en Java con el uso de palabras clave sincronizadas.

Puntos importantes relacionados con la sincronización

  • Es solo para métodos que están en el nivel de Objeto.
  • Si un método o bloque está sincronizado, entonces requiere un bloqueo a nivel de objeto para comenzar la ejecución.
  • Sincronización es la palabra más peligrosa en Java porque esta es la única razón del interbloqueo.
  • Use palabras clave sincronizadas cuando sea necesario e intente usar el bloque sincronizado.

Sincronización estática

El método sincronizado puede perder su comportamiento de obtener una salida ordenada. Cuando hay más objetos de una clase, adquiere solo el bloqueo de la instancia particular. Para mantener el comportamiento sincronizado, necesitamos un bloqueo a nivel de clase en lugar de un bloqueo a nivel de instancia que se puede lograr mediante sincronización estática.

El método sincronizado estático también es un método para sincronizar un método en Java de modo que dos subprocesos no puedan actuar simultáneamente de forma estática sobre el método sincronizado. La única diferencia es mediante el uso de sincronización estática. Estamos logrando un bloqueo de nivel de clase de modo que solo un subproceso operará en el método. El subproceso adquirirá un bloqueo de nivel de clase de una clase java, de modo que solo un subproceso puede actuar en el método sincronizado estático.

Sintaxis:

synchronized static return type class name{}

Nota: Cuando una clase tiene métodos sincronizados y sincronizados estáticos, pueden ejecutarse en paralelo, ya que esos dos métodos requieren bloqueos diferentes.

Supongamos que hay 6 hilos. El orden de ejecución será

Example - 6 Threads in Java

Temas y Clases

Aquí t1,t2…t6 son los nombres de los hilos

The complete declarations of  methods are:
method1: public static synchronized void method1()
method2: public static synchronized void method2()
method3: public static void method3()
method4: public synchronized int method4()
method5: public String method5()
  1. t1.method1() comienza la ejecución cuando alcanza el bloqueo de nivel de clase de la clase Manager.
  2. t2.method2() espera su momento para comenzar la ejecución, ya que es un método sincronizado estático, requiere un bloqueo de nivel de clase, ya que t1 ya ha adquirido el bloqueo de nivel de clase t2 debe esperar hasta la ejecución de t1.
  3. t3.method2() espera ya que requiere un bloqueo de nivel de clase, por lo que debe esperar hasta que t1 libere el bloqueo.
  4. t4.method3() comienza la ejecución ya que son métodos estáticos que no requieren bloqueo
  5. t5.method4() comienza la ejecución ya que es un método sincronizado de nivel de instancia o (normal) y requiere bloqueo de nivel de objeto, por lo que alcanza el bloqueo de nivel de objeto.
  6. t 6.method5() inicia la ejecución ya que es un método de instancia o un método normal

Ejemplo: A continuación se muestra un programa de ejemplo de subprocesos múltiples con estático sincronizado

Java

// Java program of multithreading 
// with static synchronized
  
class Display
{
    public static synchronized void wish(String name)
    {
        for(int i=0;i<3;i++)
        {
            System.out.print("Good Morning: ");
            System.out.println(name);
            try{
                Thread.sleep(2000);
            }
            catch(InterruptedException e)
            {
            }
        }
    }
}
  
class MyThread extends Thread{
    Display d;
    String name;
    MyThread(Display d,String name)
    {
        this.d=d;
        this.name=name;
    }
    public void run()
    {
        d.wish(name);
    }
}
  
class Main{
    public static void main(String arg[])
    {
        Display d1=new Display();
        Display d2=new Display();
        MyThread t1=new MyThread(d1,"Dhoni");
        MyThread t2=new MyThread(d2,"Yuvaraj");
        t1.start();
        t2.start();
    }
}

Nota: Cada deseo se imprimirá después de un intervalo de 2000 ms.

Producción

First time of execution:
Good Morning: Dhoni
Good Morning: Dhoni
Good Morning: Dhoni
Good Morning: Yuvaraj
Good Morning: Yuvaraj
Good Morning: Yuvaraj

Second time of execution:
Good Morning: Yuvaraj
Good Morning: Yuvaraj
Good Morning: Yuvaraj
Good Morning: Dhoni
Good Morning: Dhoni
Good Morning: Dhoni

Explicación:

En el programa anterior, se definen tres clases, a saber, Display, MyThread y Main, donde cada clase tiene:  

  1. visualización de clase: el código que necesita para que se ejecute el subproceso secundario
  2. clase MyThread: el propósito de esta clase es extender la clase Thread y asignar nombres de valores, y llamar al método wish de la clase Display
  3. class Main: es la clase principal de todo el programa y crea un subproceso secundario

El flujo de control:

Como sabemos, la ejecución del programa comienza con el método principal. Primero, creamos dos subprocesos secundarios y los asignamos a los objetos de visualización para los subprocesos, y después de t2.start(), habrá tres subprocesos, a saber (principal,t1,t2), y el procedimiento de ejecución es el siguiente.

Los subprocesos secundarios comienzan su ejecución t1, y como el método deseado está sincronizado estáticamente, el subproceso t1 obtiene el bloqueo de nivel de clase de la clase Mostrar y comienza a ejecutar el método deseado. Si llega el siguiente subproceso, debe esperar hasta la ejecución del subproceso anterior para lograr el bloqueo de nivel de clase.

Nota: No podemos decir el orden exacto de salida. Como programador, no podemos decir qué hilo comienza su ejecución o el orden de ejecución, no están en manos de un programador, es trabajo de Thread schedular.

Diferencia entre sincronizado y sincronizado estático en Java

 sincronizado estático sincronizado
Requiere un bloqueo a nivel de objeto. Requiere un bloqueo de nivel de clase.
Su método no necesita ser declarado estático. Su método debe declararse estático.
Se usa regularmente. No se usa regularmente.
 Se crea una instancia diferente para cada objeto. Una sola instancia para todo el programa.

Publicación traducida automáticamente

Artículo escrito por srivathsanani y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

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