Guía de Sincronización en Java

Publicado: 2022-10-23

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.

Consulte nuestros cursos de tecnología gratuitos para obtener una ventaja sobre la competencia.

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

Aprenda cursos de desarrollo de software en línea de las mejores universidades del mundo. Obtenga Programas PG Ejecutivos, Programas de Certificado Avanzado o Programas de Maestría para acelerar su carrera.

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 determinado.

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.

Consulte la Certificación avanzada de upGrad en DevOps

La sintaxis para escribir un bloque sincronizado

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

sincronizado (lockObject)

{

// sentencias sincronizadas

}

Explore nuestros cursos populares de ingeniería de software

Maestría en Ciencias en Ciencias de la Computación de LJMU & IIITB Programa de Certificado de Ciberseguridad Caltech CTME
Bootcamp de desarrollo de pila completa Programa PG en Blockchain
Programa Ejecutivo PG en Desarrollo Full Stack
Ver todos nuestros cursos a continuación
Cursos de ingeniería de software

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.

Consulta la Certificación Avanzada en Seguridad Cibernética de upGrad

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.

Habilidades de desarrollo de software bajo demanda

Cursos de JavaScript Cursos básicos de Java Cursos de Estructuras de datos
Cursos de Node.js Cursos SQL Cursos de desarrollo de pila completa
Cursos NFT Cursos DevOps Cursos de Big Data
Cursos de React.js Cursos de Seguridad Cibernética Cursos de computación en la nube
Cursos de diseño de base de datos Cursos de Python Cursos de Criptomonedas

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();

}

}

Lea nuestros artículos populares relacionados con el desarrollo de software

¿Cómo implementar la abstracción de datos en Java? ¿Qué es la clase interna en Java? Identificadores de Java: definición, sintaxis y ejemplos
Comprender la encapsulación en OOPS con ejemplos Argumentos de línea de comando en C explicados Las 10 funciones y características principales de la computación en la nube en 2022
Polimorfismo en Java: conceptos, tipos, características y ejemplos ¿Paquetes en Java y cómo usarlos? Tutorial de Git para principiantes: Aprende Git desde cero

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.

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.

¿Quieres aprender los conceptos básicos de Java? El programa de posgrado ejecutivo upGrad en desarrollo de software: el curso de especialización en desarrollo de pila completa es un programa en línea de 7 semanas para principiantes que desean explorar carreras de desarrollo de software. Asista a clases interactivas y en vivo, sesiones de práctica y más de 35 horas de contenido impartido por líderes de la industria para obtener un certificado de finalización de upGrad.

¡ Regístrese hoy para aprovechar los beneficios exclusivos de upGrad de soporte para estudiantes 24/7 y redes de la industria!

¿Por qué usamos sincronizado en Java?

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.

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

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.

¿Qué es un interbloqueo en Java?

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.