Guía completa de sincronización en Java

Publicado: 2022-05-20

Antes de explicar la sincronización en Java , debemos revisar brevemente el concepto de subprocesamiento múltiple. La característica de subprocesos múltiples de Java permite la ejecución simultánea de dos o más partes de un programa para la máxima utilización de la CPU. Cada parte de un programa de este tipo es un hilo, y los hilos son procesos ligeros dentro de un proceso.

Ahora, varios subprocesos de un programa pueden intentar acceder a los mismos recursos y producir resultados inexactos. Por lo tanto, debe haber alguna sincronización para garantizar que solo un subproceso tenga acceso a los recursos en un momento dado.

Esta guía sobre qué es la sincronización en Java explorará el concepto de sincronización en detalle con ejemplos.

Tabla de contenido

¿Qué es la sincronización en Java?

La sincronización de Java es la capacidad de controlar el acceso de varios subprocesos a un recurso compartido. Es útil cuando los programas Java de subprocesos múltiples intentan acceder al mismo recurso y producen resultados erróneos. Con la función de sincronización de Java, solo un único subproceso puede acceder al recurso en un momento dado.

Java proporciona una forma de sincronizar la tarea de los subprocesos utilizando bloques sincronizados que se sincronizan en el mismo objeto y solo pueden tener un subproceso ejecutándose dentro de ellos a la vez. Estos bloques están marcados con la palabra clave sincronizada, bloqueando cualquier otro subproceso que intente ingresar al bloque sincronizado hasta que el subproceso que ya está dentro del bloque finaliza su ejecución y abandona el bloque.

La sintaxis para escribir un bloque sincronizado

La sintaxis general para escribir un bloque sincronizado en Java es la siguiente:

sincronizado (lockObject)

{

// sentencias sincronizadas

}

En la sintaxis anterior, lockObject se refiere a un objeto cuyo bloqueo está relacionado con los elementos sincronizados. Ahora, eso nos lleva al concepto de bloqueo en Java.

Bloqueos en Java

La sincronización en Java se basa en el bloqueo o el monitor. Cada objeto tiene un candado asociado. Idealmente, un subproceso que requiere acceso a los campos de un objeto primero debe obtener el bloqueo del objeto. El bloqueo es un mecanismo de sincronización de subprocesos más sofisticado y flexible que el bloque de sincronización. Se define dentro del paquete java.util.concurrent.lock que contiene amplias implementaciones de bloqueo.

Aprenda cursos de desarrollo de software en línea de las mejores universidades del mundo. Obtenga programas Executive PG, programas de certificados avanzados o programas de maestría para acelerar su carrera.

Método sincronizado de Java

El propósito de un método sincronizado de Java es bloquear objetos para recursos compartidos. Por lo tanto, cuando los subprocesos invocan un método sincronizado, el método obtiene automáticamente el bloqueo para ese objeto y lo libera una vez que el subproceso ejecuta su trabajo.

Aquí hay un ejemplo de un método sincronizado de Java:

// ejemplo de método sincronizado java

tabla de clases{

printTable vacío sincronizado (int n){//método sincronizado

para(int i=1;i<=5;i++){

Sistema.salida.println(n*i);

probar{

Subproceso.dormir(400);

}catch(Excepción e){System.out.println(e);}

}

}

}

clase MyThread1 extiende Thread{

Tabla t;

MiSubproceso1(Tabla t){

esto.t=t;

}

ejecución de vacío público(){

t.imprimirTabla(5);

}

}

clase MyThread2 extiende Thread{

Tabla t;

MiSubproceso2(Tabla t){

esto.t=t;

}

ejecución de vacío público(){

t.imprimirTabla(100);

}

}

clase pública TestSynchronization2{

public static void main(String args[]){

Table obj = new Table();//solo un objeto

MiSubproceso1 t1=nuevo MiSubproceso1(obj);

MiSubproceso2 t2=nuevo MiSubproceso2(obj);

t1.inicio();

t2.inicio();

}

}

Producción:

5

10

15

20

25

100

200

300

400

500

¿Qué sucede sin sincronización?

Ahora, veamos el programa anterior sin sincronización (note la ausencia de la palabra clave sincronizada).

tabla de clases{

void printTable(int n){//método no sincronizado

para(int i=1;i<=5;i++){

Sistema.salida.println(n*i);

probar{

Subproceso.dormir(400);

}catch(Excepción e){System.out.println(e);}

}

}

}

clase MyThread1 extiende Thread{

Tabla t;

MiSubproceso1(Tabla t){

esto.t=t;

}

ejecución de vacío público(){

t.imprimirTabla(5);

}

}

clase MyThread2 extiende Thread{

Tabla t;

MiSubproceso2(Tabla t){

esto.t=t;

}

ejecución de vacío público(){

t.imprimirTabla(100);

}

}

clase TestSynchronization1{

public static void main(String args[]){

Table obj = new Table();//solo un objeto

MiSubproceso1 t1=nuevo MiSubproceso1(obj);

MiSubproceso2 t2=nuevo MiSubproceso2(obj);

t1.inicio();

t2.inicio();

}

}

Producción:

5

100

10

200

15

300

20

400

25

500

Como puede ver, la salida es inconsistente sin sincronización.

Explore nuestros cursos populares de ingeniería de software

SL. No Programas de desarrollo de software
1 Maestría en Ciencias en Ciencias de la Computación de LJMU & IIITB Programa de Certificado de Ciberseguridad Caltech CTME
2 Bootcamp de desarrollo de pila completa Programa PG en Blockchain
3 Programa Ejecutivo de Postgrado en Desarrollo de Software - Especialización en DevOps Ver todos los cursos de ingeniería de software

Tipos de sincronización en Java

Para responder qué es la sincronización de subprocesos en Java , tenemos dos tipos de sincronización disponibles: sincronización de subprocesos y sincronización de procesos.

Entendamos lo que significa cada uno.

Sincronización de subprocesos: cuando varios subprocesos intentan acceder a un recurso compartido, debemos asegurarnos de que el recurso sea utilizado solo por un subproceso a la vez. La sincronización de subprocesos es el proceso de permitir que solo un subproceso use el recurso compartido cuando varios subprocesos intentan usar el recurso simultáneamente.

Sincronización de procesos: se refiere a la ejecución simultánea de múltiples procesos para alcanzar un estado en el que los procesos se comprometan con un orden de ejecución apropiado. La sincronización de procesos es necesaria cuando dos o más procesos cooperan y la ejecución de un proceso afecta al otro. Por lo tanto, la sincronización de procesos elimina la posibilidad de salidas inexactas y garantiza el orden de ejecución adecuado.

Métodos de Sincronización en Java

En términos generales, existen cuatro métodos de sincronización en Java:

  • Métodos estáticos sincronizados
  • Métodos de instancias sincronizadas
  • Bloque sincronizado dentro de métodos estáticos
  • Bloque sincronizado dentro de los métodos de instancia

Veamos cada método de sincronización de Java con más detalle.

Métodos estáticos sincronizados

Aquí, usamos la palabra clave sincronizada para marcar los métodos estáticos en Java. Aquí hay un ejemplo de un método estático sincronizado de Java:

public static MyStaticCounter {

conteo interno estático privado = 0;

incremento de vacío sincronizado estático público (valor int) {

cuenta += valor;

}

}

Métodos de instancias sincronizadas

Cuando se usa un bloque sincronizado con métodos de instancia, cada objeto tiene su método sincronizado. Cada objeto puede tener solo un hilo que puede ejecutarse dentro de un método. Si hay varios objetos, se puede ejecutar un único subproceso para cada objeto dentro del bloque.

public class MiContador {

conteo int privado = 0;

incremento de vacío sincronizado público (valor int) {

this.count += valor;

}

decremento vacío sincronizado público (valor int) {

this.count -= valor;

}

}

Bloque sincronizado dentro de métodos estáticos

A continuación se muestra un ejemplo en el que usamos un bloque sincronizado dentro de un método estático:

clase pública MiClase {

impresión de vacío estático público (mensaje de cadena) {

sincronizado(MiClase.clase) {

log.writeln(mensaje);

}

}

}

Bloque sincronizado dentro de los métodos de instancia

En lugar de sincronizar todo el método, podemos usar sincronizado en un bloque específico dentro del método. A continuación se muestra un ejemplo de un bloque de código sincronizado dentro de un método no sincronizado:

incremento de vacío público (valor int) {

sincronizado(esto) {

this.count += valor;

}

}

Necesidad de sincronización en Java

Ahora que sabe qué es la sincronización en Java , es posible que se pregunte por qué la usamos en primer lugar.

La palabra clave sincronizada de Java proporciona funcionalidades esenciales para la programación concurrente. Así es como ayuda la sincronización en Java:

  • La sincronización de Java proporciona la función de bloqueo para eliminar cualquier condición de carrera entre subprocesos y garantizar un acceso mutuamente exclusivo al recurso compartido.
  • El bloqueo sincronizado de Java proporciona funciones de bloqueo y desbloqueo. Por lo tanto, un subproceso debe adquirir el bloqueo antes de ingresar a un método o bloque sincronizado.
  • La palabra clave sincronizada evita que el compilador reordene las sentencias del programa.

Conclusión

En resumen, la sincronización en Java garantiza que solo un subproceso pueda acceder al recurso compartido a la vez. Podemos sincronizar un bloque o método usando la palabra clave sincronizada de Java. Cuando un subproceso quiere ingresar a un bloque sincronizado, debe adquirir un bloqueo y, después de abandonar el bloque, el subproceso libera el bloqueo. Podemos usar la palabra clave sincronizada con métodos o dentro del bloque de un método.

¿Te preguntas dónde aprender Java?

Certificación PG vinculada al trabajo de upGrad en ingeniería de software es lo que buscas!

Especialmente diseñado para recién graduados y últimos años, la Certificación PG vinculada al trabajo de upGrad en Ingeniería de software es perfecta para aquellos que desean aprender a programar y ubicarse en roles de software de nivel de entrada. ¡Este programa en línea de 5 meses enseñará las mejores habilidades de software como Java, JavaScript, HTML5, DSA, AWS, MERN y más!

P: ¿Por qué usamos sincronizado en Java?

R: La palabra clave sincronizada en Java garantiza que solo un subproceso pueda acceder a los recursos compartidos a la vez. Es útil cuando los programas Java de subprocesos múltiples intentan acceder al mismo recurso y producen resultados inexactos.

P: ¿Cómo se implementa la sincronización en Java?

R: Java implementa la sincronización usando el concepto de monitores con solo un subproceso que posee un monitor en un momento dado. Cuando un subproceso adquiere un bloqueo, obtiene acceso al monitor y todos los demás subprocesos que intentan ingresar al monitor bloqueado permanecen bloqueados hasta que el primer subproceso abandona el monitor.

P: ¿Qué es un interbloqueo en Java?

R: El interbloqueo de Java ocurre cuando un subproceso está esperando un bloqueo de objeto, pero otro subproceso lo adquiere, y el segundo subproceso está esperando un bloqueo de objeto adquirido por el primero. Por lo tanto, ambos subprocesos esperan el uno al otro para liberar el bloqueo, lo que resulta en un interbloqueo.