Sincronización en Java: ¿qué, cómo y por qué?



Este artículo sobre Sincronización en Java le ayudará a orientar su camino para aprender a sincronizar los programas multiproceso.

Los programas de subprocesos múltiples pueden presentar regularmente una circunstancia en la que múltiples Intente llegar al mismo recurso que produce resultados fraudulentos y sorprendentes. Esto se puede solucionar utilizando la sincronización en Java. Solo un hilo específico puede llegar al recurso en un determinado período de tiempo. Este artículo le ayudará a familiarizarse con la estrategia de sincronización.

Hablaré de los temas en este orden:





¡Empecemos!

¿Por qué utilizar la sincronización en Java?



diferencia entre final finalmente y finalizar

Si comienza con al menos dos subprocesos dentro de un programa, puede existir la posibilidad de que varios subprocesos intenten acceder al mismo recurso. Incluso puede crear un resultado inesperado debido a problemas de concurrencia.

Sintaxis :

sincronizado (identificador de objeto) {// Acceder a variables compartidas y otros recursos compartidos}

Por ejemplo, intente escribir dentro de un archivo equivalente. Esto puede dañar los datos, ya que uno de los subprocesos puede anular los datos o cuando un subproceso está abriendo elmismo archivo al mismo tiempo, otro hilo puede estar cerrando el mismo archivo.Es necesario sincronizar la acción de varios subprocesos. Esto se puede implementar usando un concepto llamado METRO onitores .



  • Cada está asociado con un monitor, que un hilo puede bloquear o desbloquear.
  • Solo un hilo a la vez puede mantener un bloqueo en un monitor.
  • Java El lenguaje de programación proporciona una forma muy práctica de crear hilos y sincronizar su tarea mediante el uso de Sincronizado bloques.
  • También mantiene los recursos compartidos dentro de este bloque en particular.

Los bloques sincronizados en Java están marcados con el Sincronizado palabra clave. Este bloque en Java está sincronizado en algún objeto.Todos los bloques que están 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 entrar en el bloque sincronizado se bloquean hasta que el subproceso dentro del bloque sincronizado sale del bloque.

Tipos de sincronización

Básicamente, hay dos tipos de sincronización disponibles. Son:

  1. Sincronización de procesos: La ejecución simultánea de múltiples subprocesos o procesos para alcanzar un estado tal que se comprometan con una determinada secuencia de acciones.
  2. Sincronización de hilos: A veces cuando más de un hilointenta acceder a un recurso compartido, debe asegurarse de que el recurso será utilizado por un solo hilo enun momento.

No entremos en los detalles de estos tipos y tratemos de entender qué son bloqueos .

Bloqueos en Java

Como mencioné anteriormente, la sincronización se basa en una entidad interna conocida como bloquear o monitor . Todos y cada uno de los objetos tienen un candado asociado. Por lo tanto, un subproceso que necesita acceso constante a los campos de un objeto necesita adquirir el bloqueo del objeto antes de acceder a ellos y luego liberar el bloqueo cuando el trabajo esté terminado.

Desde Java 5, el paquete java.util.concurrent.locks contiene muchas implementaciones de bloqueo.

Así es como se ve un candado:

public class Lock {privado booleano isLocked = falso public sincronizado void lock () lanza InterruptedException {while (isLocked) {wait ()} isLocked = true} público sincronizado void desbloqueado () {isLocked = falso notificar ()}}

El método lock () bloquea la instancia de Lock para que todos los subprocesos que llaman a lock () se bloqueen hasta que se ejecute unlock ().

Multihilo sin sincronización

Aquí hay un ejemplo simple que imprime el valor del contador en una secuencia y cada vez que lo ejecutamos, produce un resultado diferente basado en la disponibilidad de CPU para un hilo. ¡Mira esto!

class Multithread {public void printCount () {try {for (int i = 5 i<0 i--) { System.out.println('Counter --- ' + i ) } } catch (Exception e) { System.out.println('Thread interrupted.') } } } class Thread extends Multithread { private Thread t private String threadName Multithread MT Thread( String name, Multithread mt) { threadName = name MT= mt } public void run() { MT.printCount() System.out.println('Thread ' + threadName + ' exiting.') } public void start () { System.out.println('Starting ' + threadName ) if (t == null) { t = new Thread (this, threadName) t.start () } } } public class TestThread { public static void main(String args[]) { Multithread MT = new Multithread() Thread t = new Thread( 'Thread - 1 ', MT) Thread t1 = new Thread( 'Thread - 2 ', MT) t.start() t1.start() // wait for threads to end try { t.join() t1.join() } catch ( Exception e) { System.out.println('Interrupted') } } }

Los resultados del programa anterior en esto:

Salida- Sincronización en Java- Edureka

Multihilo con sincronización

Este es el mismo ejemplo que el anterior pero imprime el valor del contador en la secuencia. Cada vez que lo ejecutamos, produce el mismo resultado.

class Multithread {public void printCount () {try {for (int i = 5 i> 0 i--) {System.out.println ('Counter ---' + i)}} catch (Exception e) {System. out.println ('Subproceso interrumpido.')}}} class El subproceso extiende Multithread {subproceso privado t Cadena privada threadName Subproceso MT subproceso (nombre de la cadena, multiproceso mt) {threadName = nombre MT = mt} public void run () {sincronizado ( MT) {MT.printCount ()} System.out.println ('Thread' + threadName + 'saliendo')} public void start () {System.out.println ('Iniciando' + threadName) if (t == null) {t = new Thread (this, threadName) t.start ()}}} public class TestThread {public static void main (String args []) {Multithread MT = new Multithread () Thread T = new Thread ('Thread - 1 ', MT) Thread T1 = new Thread (' Thread - 2 ', MT) T.start () T1.start () // espera a que terminen los hilos try {T.join () T1.join ()} catch (Exception e) {System.out.println ('Interrupted')}}}

El resultado se muestra a continuación:

Palabra clave sincronizada

palabra clave sincronizada marca un bloque o un método como una sección crítica. Una sección crítica es donde solo se ejecuta un subproceso a la vez, y el subproceso mantiene el bloqueo para la sección sincronizada. Esta sincronizado la palabra clave ayuda a escribir concurrente partes de cualquier aplicación. También protege los recursos compartidos dentro del bloque.

La palabra clave sincronizada se puede utilizar con:

Analicemos el bloque de código.

Palabra clave sincronizada: un bloque de código

Sintaxis

La sintaxis general para escribir un bloque sincronizado es:

sincronizado (lockObject) {// declaraciones sincronizadas}

Cuando un hilo quiere ejecutar las declaraciones sincronizadas dentro del bloque, debe adquirir el bloqueo en el monitor de lockObject. Solo un hilo puede adquirir el monitor de un objeto de bloqueo a la vez. Por lo tanto, todos los demás subprocesos deben esperar hasta que el subproceso que se está ejecutando actualmente adquiera el bloqueo y finalice su ejecución.
De esta manera, el sincronizado La palabra clave garantiza que solo un subproceso ejecutará las declaraciones de bloque sincronizadas a la vez y, por lo tanto, evita que varios subprocesos corrompan los datos compartidos que están presentes dentro del bloque.

Nota :

  • Si un hilo se pone en reposo (usando dormir() método) entonces no libera el bloqueo. Durante este tiempo de suspensión, ningún subproceso ejecutará las sentencias de bloque sincronizadas.
  • La sincronización de Java arrojará Excepción de puntero nulo si el objeto de bloqueo se usa en ' sincronizado (bloqueo) ' es nulo.

Ahora, analicemos el método.

Palabra clave sincronizada: Un método

Sintaxis

La sintaxis general para escribir un método sincronizado es:

método sincronizado (parámetros) {// código sincronizado}

Aquí lockObject es solo una referencia a un objeto cuyo bloqueo está asociado con el monitor que representa las declaraciones sincronizadas.

De manera similar al bloque sincronizado, un subproceso debe adquirir el bloqueo en el objeto de monitor conectado con el método sincronizado. En el caso del método sincronizado, el objeto de bloqueo es:

  • Objeto '.class' - si el método dado es estático .
  • 'Este' objeto - si el método es no estático . 'Esto' es la referencia al objeto actual en el que se invoca el método sincronizado.

La palabra clave sincronizada de Java es reentrante en naturaleza. Significa que si un método sincronizado llama a otro método sincronizado que requiere el mismo bloqueo, entonces el hilo actual que mantiene el bloqueo puede ingresar a ese método sin adquirir el bloqueo.

Pasemos al tema final de este artículo y señalemos las principales diferencias entre la palabra clave sincronizada y el bloque de sincronización.

Diferencia entre palabra clave sincronizada y bloque sincronizado

  • Cuando usa una palabra clave sincronizada con una método , adquiere un bloqueo en el objeto para todo el método. Esto significa que ningún otro subproceso puede utilizar ningún método sincronizado hasta que el subproceso actual que se invoca haya finalizado su ejecución.
  • Sincronizado bloquear adquiere un bloqueo en el objeto solo entre paréntesis después de que se especifica la palabra clave sincronizada. Esto significa que ningún otro hilo puede adquirir un bloqueo en el objeto ya bloqueado hasta que el bloque salga. Pero otros subprocesos podrán acceder al resto del código que está presente en el método.

Esto nos lleva al final de este artículo donde hemos discutido cómo funciona exactamente la sincronización en Java. Espero que tengas claro todo lo que se ha compartido contigo en este tutorial.

Revisar la por Edureka, una empresa de aprendizaje en línea de confianza con una red de más de 250.000 alumnos satisfechos repartidos por todo el mundo. Estamos aquí para ayudarlo en cada paso de su viaje, para que, además de estas preguntas de la entrevista de Java, se desarrolle un plan de estudios diseñado para estudiantes y profesionales que desean ser Desarrolladores de Java.

Tienes una pregunta para nosotros? Por favor, menciónelo en la sección de comentarios de este 'Sincronización en Javaartículo y nos pondremos en contacto con usted lo antes posible.