Synchronized es el modificador aplicable solo para métodos y bloques, pero no para clases y variables. Si varios subprocesos intentan operar simultáneamente en el mismo objeto Java, entonces puede haber una posibilidad de que haya un problema de inconsistencia de datos. Para superar este problema, deberíamos buscar una palabra clave » sincronizada «. Si un método o bloque se declara sincronizado, entonces solo un subproceso puede ejecutar ese método o bloque en el objeto dado a la vez para que se resuelva el problema de inconsistencia de datos. El concepto de sincronización interna se implementa mediante el bloqueo. Cada objeto en Java tiene un bloqueo único. Siempre que estemos usando una palabra clave ‘ sincronizada ‘, solo el concepto de bloqueo aparecerá en la imagen.
Si un subproceso quiere ejecutar un método sincronizado en el objeto dado primero, debe obtener un bloqueo de ese objeto una vez que el subproceso obtuvo el bloqueo, entonces se le permite ejecutar cualquier método sincronizado en ese objeto. JVM se encarga de adquirir y liberar el bloqueo internamente y el programador no es responsable de esta actividad. Mientras un subproceso ejecuta un método sincronizado en el objeto dado, los subprocesos restantes no pueden ejecutar ningún método sincronizado simultáneamente en el mismo objeto. Pero los subprocesos restantes pueden ejecutar métodos no sincronizados simultáneamente.
El bloqueo de nivel de objeto es un mecanismo en el que cada objeto en Java tiene un bloqueo único que no es más que un bloqueo de nivel de objeto. Si un subproceso quiere ejecutar un método sincronizado en el objeto dado, entonces el subproceso primero requirió el bloqueo de nivel de objeto una vez que el subproceso obtiene el bloqueo de nivel de objeto, entonces se le permite ejecutar cualquier método sincronizado en el objeto dado y una vez que la ejecución del método se completó automáticamente subproceso libera la cerradura de ese objeto.
Ejemplo:
Java
// Java program to illustrate Object Level Lock Concept // Import required packages import java.io.*; import java.util.*; // Class 1 // Helper Class 1 // Consists of synchronized method wish class Display { // Declaring Non-static wish method public void wish(String name) { // synchronizing wish method // and getting the lock of current object synchronized (this) { for (int i = 1; i <= 10; i++) { // display message only System.out.print("Good Morning: "); // Try block to check. for exceptions try { // Putting thread on sleep for specified // time // using the sleep() method Thread.sleep(1000); } // Catch block to handle the exceptions catch (InterruptedException e) { // Print the occurred exception/s System.out.println(e); } // Display message only System.out.println(name); } } } } // Class 2 // Helper Class 2 (extending main Thread Class) // myThread with override the run method and // consists of parameterized constructor class myThread extends Thread { // member variable of this class Display d; String name; // Constructor(Parameterized) of this class myThread(Display d, String name) { // this keyword refers to current object itself this.d = d; this.name = name; } // run() method for thread public void run() { // Calling wish method of display class d.wish(name); } } // Class 3 // Main Class class GFG { // Main driver method public static void main(String[] args) { // Creating display class(Class 1) object // in the main() method Display d = new Display(); // Creating thread objects in main method() myThread t1 = new myThread(d, "Dhoni"); myThread t2 = new myThread(d, "Yuvraj"); // Starting the threads using the start() method t1.start(); t2.start(); } }
El bloqueo de nivel de clase es un mecanismo en el que cada clase en Java tiene un bloqueo único que no es más que un bloqueo de nivel de clase. Si un subproceso desea ejecutar un método sincronizado estático, entonces el subproceso requiere un bloqueo de nivel de clase una vez que el subproceso obtiene un bloqueo de nivel de clase, entonces se le permite ejecutar cualquier método sincronizado estático de esa clase. Una vez que se completa la ejecución del método, el subproceso libera automáticamente el bloqueo. Mientras un subproceso ejecuta un método sincronizado estático, el subproceso restante no puede ejecutar ningún método sincronizado estático de esa clase simultáneamente.
Ejemplo:
Java
// java program to illustrate Class Level Lock Concept // Importing required packages import java.io.*; import java.util.*; // Class 1 // Helper Class // Consist of synchronized method wish class Display { // Declaring static wish method public static void wish(String name) { // synchronizing wish method // and getting the lock of display class synchronized (Display.class) { for (int i = 1; i <= 10; i++) { // Display message only System.out.print("Good Morning: "); // Try block to check for exceptions try { // Putting thread on sleep for specified // time // using the sleep() method Thread.sleep(1000); } // Catch block to handle the exception catch (InterruptedException e) { // Throwing exception System.out.println(e); } // Display message System.out.println(name); } } } } // C;asss 2 // Helper Class (extends the Thread class) // myThread with override the run method // as per our requirements it also consists // of parameterized constructor class myThread extends Thread { // Member variables of this class Display d; String name; // Constructor of this class myThread(Display d, String name) { // This keyword refers to current object itself this.d = d; this.name = name; } // run method for thread/s public void run() { // Calling wish method of display class d.wish(name); } } // Class 3 // Main Class class GFG { // Main driver method public static void main(String[] args) { // Creating Display class(Class 1) object // in the main() method Display d = new Display(); // Creating a thread objects myThread t1 = new myThread(d, "Dhoni"); myThread t2 = new myThread(d, "Yuvraj"); // Starting the threads using start() method t1.start(); t2.start(); } }
Bloqueo de nivel de clase |
Bloqueo de nivel de objeto |
---|---|
Este bloqueo se puede usar cuando queremos evitar que múltiples subprocesos ingresen al bloque sincronizado de instancias disponibles en tiempo de ejecución. | Este bloqueo se usa cuando queremos que un método no estático o un bloque no estático de nuestro código sea accedido por solo un subproceso a la vez. |
Este bloqueo se utiliza para hacer que los datos estáticos sean seguros para subprocesos. | Este bloqueo se utiliza para hacer que los datos no estáticos sean seguros para subprocesos. |
Pueden existir varios objetos de una clase en particular, pero siempre hay disponible un bloqueo de objeto de clase de una clase. | Cada objeto de la clase tiene su propio candado. |
Podemos obtener un bloqueo de nivel de clase de la siguiente manera: clase pública GFG { vacío público m1( ) { sincronizado (GFG.class) { // alguna línea de código } } |
Podemos obtener el bloqueo de nivel de objeto de la siguiente manera: clase pública GFG { vacío público m1( ) { sincronizado (esto) { // alguna línea de código } } } |
Publicación traducida automáticamente
Artículo escrito por mroshanmishra0072 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA