¿Ha notado la condición de carrera en el ejemplo de concurrencia de subprocesos múltiples de Java? ¿Cómo lidiar con ello?

Publicado: 2019-12-11

¿Has notado la condición de la carrera en el ejemplo de concurrencia de subprocesos múltiples de Java?

Hace algún tiempo escribí un artículo sobre Producer Consumer Example y cómo manejar mejor la operación de lectura/escritura en Java. En la nota similar, en este tutorial discutiremos algo sobre Race Condition y el Thread locking .

Si tiene alguna de las siguientes preguntas, entonces está en el lugar correcto:

  • Ejemplo de condición de carrera de Java
  • ejemplo java mutex
  • subprocesamiento múltiple: ¿qué es una condición de carrera?
  • Condiciones de carrera y tramos críticos
  • ¿Qué es la condición de carrera?
  • Cómo lidiar con la condición de carrera en Java con un ejemplo

¿Por qué ocurre la condición de carrera en Java?

La condición de carrera en Java ocurre cuando two or more threads intentan modificar/actualizar datos compartidos al same time .

Echemos un vistazo a la lógica del programa a continuación:

Este es un ejemplo bancario muy simple en el que deposit y withdraw montos 100 times . Depositará $100 en total 100 veces = $100 x 100 = $10,000 y retirará $50 en total 100 veces = $50 x 100 = $5,000. Al final de la finalización del programa, debe tener $ 5000 en su banco.

Aquí están los pasos:

  1. Crear clase CrunchifyRaceCondition.java
  2. Crear clase CrunchifyTransaction.java
  3. Crear clase CrunchifyBankAccount.java
  4. Ejecutaremos la clase CrunchifyRaceCondition y comenzará el ciclo de depósito y retiro 100 veces.
  5. Lo ejecutaremos with Synchronized block para verificar el resultado.
  6. Lo ejecutaremos without Synchronized block para verificar el resultado

CrunchifyRaceCondition.java

CrunchifyTransaction.java

CrunchifyBankAccount.java

Consulte las líneas 24 y 34 anteriores. Mantenga esa palabra clave Synchronized y ejecute su programa. Debería ver el resultado correcto como lo ve en la imagen de abajo.

Palabra clave de bloque sincronizado de Java - Crunchify

Ahora elimine la palabra clave sincronizada de las líneas 24 y 34 y ejecute el mismo programa.

Es posible que deba ejecutar este programa varias veces para ver un problema. En Java no hay garantía de que verá la condición de carrera todo el tiempo.

Java sin palabra clave de bloque sincronizado - Crunchify

Si tiene una aplicación de nivel empresarial y está hablando de millones de transacciones por segundo, la condición de carrera puede causar un desastre para su empresa.

Ahora la pregunta es cómo evitar la condición de carrera en su aplicación Java.

  1. Si la condición de carrera está en las actualizaciones de algunas estructuras de datos en memoria compartidas, debe sincronizar el acceso y las actualizaciones a la estructura de datos de manera adecuada.
  2. Si la condición de carrera está en las actualizaciones de su base de datos, debe reestructurar su SQL para usar transacciones en el nivel adecuado de granularidad.
  3. No es una mala idea hacer pruebas de carga antes de pasar a producción. Más carga puede causar condiciones de carrera raras. Es mejor arreglarlo antes que arreglarlo después.
  4. Asegúrese de no tener ninguna variable global en la que escriba.
  5. En Java, cada objeto tiene un único monitor y mutex asociado. Sin embargo, el monitor único tiene varias puertas, cada una indicada por la palabra clave synchronized . Cuando un subproceso pasa por encima de la palabra clave synchronized , efectivamente bloquea todas las puertas.
  6. Por supuesto, si un subproceso no pasa a través de la palabra clave synchronized , no ha cerrado la puerta, y algún otro subproceso puede entrar libremente en cualquier momento.