¿Qué es la concurrencia en Java?
En el mundo de hoy, todo se está desarrollando rápidamente. Siempre hay un alcance de mejora en todos y cada uno. Así es el caso con nuestro lenguaje de programación. Hoy, con nuestras tecnologías modernas, esperamos que las cosas se hagan con facilidad y rapidez. Para hacer varias cosas al mismo tiempo o para hacer varias cosas simultáneamente, surgió el concepto de concurrencia. Entonces, qué es la concurrencia, cuál es su uso, por qué es realmente necesario y muchos más. Intentaremos tocar esas preguntas y responderlas en este artículo una por una. Así que llevemos nuestra discusión a una sección común muy básica que es la definición de concurrencia. En este tema, vamos a aprender sobre Qué es la concurrencia en Java.
Definición de concurrencia?
Entonces, ¿qué concurrencia es en realidad? Bueno, para responder eso, tomemos un escenario común. Suponga que mientras lee este artículo, está tratando de hacer varias cosas simultáneamente, puede estar tratando de hacer una nota también, tal vez está tratando de entenderlo o pensar algunas cosas. Entonces, en palabras simples, estás tratando de hacer varias cosas en paralelo. Esto es lo que significa una concurrencia. La concurrencia es simplemente ejecutar múltiples tareas en paralelo entre sí. Discutiremos la concurrencia en este artículo en el ámbito de Java como lenguaje de programación.
En realidad, en Java o en general en cualquier lenguaje de programación, es el hilo el responsable de llevar la concurrencia. La función básica de estos hilos es facilitar la ejecución paralela de tareas. Mientras tanto, tengamos una definición básica de hilo.
Entonces, ¿qué es un hilo?
Un hilo es un proceso ligero con su propia pila de llamadas. Sin embargo, un hilo tiene el privilegio de acceder a datos compartidos de otros hilos que se ejecutan bajo el mismo proceso. Dentro de una aplicación Java, podemos usar muchos hilos para lograr un procesamiento paralelo o concurrencia.
Ahora pasemos al siguiente tema, que es,
Concurrencia en la definición de Java?
Entonces, en Java o en cualquier otro lenguaje de programación como C #, etc., todo el lenguaje de OOP tiene un concepto de subprocesamiento. En Java, tenemos diferentes procesos que se ejecutan haciendo diferentes hilos para lograr la concurrencia.
Entonces, después de esta definición simple, discutamos nuestro nuevo tema que es:
¿Qué hace que la aplicación Java sea concurrente?
La primera clase, que se necesita para que una aplicación Java sea concurrente, es la clase java.lang.Thread. La clase java.lang.Thread es responsable de todos los conceptos de concurrencia en el lenguaje de programación Java. Después de esto, tenemos la interfaz java.lang.Runnable para abstraer el comportamiento del hilo fuera de la clase de hilo.
Se utilizará otra clase que necesitaremos para construir una aplicación avanzada del paquete java.util.concurrent agregado en Java 1.5.
Ahora con eso, hemos llegado a una nueva pregunta que es:
¿Es Java Concurrency realmente así de simple?
Como parece que implementar la concurrencia en Java es bastante simple. Sin embargo, realmente no es así. Veamos por ello.
Nuestra discusión anterior generalmente da la impresión de que la concurrencia es de hecho un concepto simple, bueno y bastante fácil de implementar. Bueno, si monitoreamos de una manera mejor y tratamos de entenderlo, descubrimos que requiere una buena comprensión de los conceptos básicos, así como una comprensión profunda de lo que necesitamos lograr.
Si comparamos aplicaciones concurrentes y una aplicación de subproceso único, generalmente encontramos que una aplicación concurrente es compleja en términos de diseño y comprensión. El código ejecutado por múltiples hilos requiere atención y recursos especiales para acceder a los datos compartidos. Los errores que aparecen debido a la sincronización incorrecta de subprocesos son difíciles de depurar y corregir. Además, en la mayoría de los escenarios, estos errores no se identifican en la fase inicial, de hecho, se detecta en modo de producción, que es aún más difícil de reproducir.
Además de errores y defectos comunes, los hilos concurrentes requieren más recursos para ejecutar la aplicación
Problemas y mejora en la concurrencia - Explicación con ejemplo
Básicamente, hay dos tipos de problemas que se asignan debido a la concurrencia. Estos problemas pueden clasificarse ampliamente en dos categorías.
- Errores de interferencia de subprocesos
- Errores de consistencia de memoria
Entendamos cada uno por uno
Errores de interferencia de subprocesos : comprendamos con un ejemplo simple.
Supongamos que tenemos una función de contador, cuya función básica es aumentar el contador o el recuento de un número. Ahora suponga que tenemos dos hilos, el hilo A y el hilo B. Supongamos que el hilo A lee el valor inicial como 0. Ahora, los siguientes pasos se ejecutan secuencialmente.
- El hilo A lee el valor inicial como 0
- El hilo B lee el valor inicial como 0
- Tema A aumentar el valor en 1. El nuevo valor ahora es 1
- El hilo B también en paralelo aumenta el valor a 1.
- El subproceso A escribe un valor actualizado que es 1 en la celda de memoria
- El subproceso B también repite el mismo paso, que se escribe en el valor actualizado de la celda de memoria de 1
Entonces aquí surge el problema. Dos subprocesos A y B, ejecutan el código dos veces y el valor esperado es 2, pero lo que se refleja es 1. Este es el principal problema que pueden causar múltiples subprocesos
¿Cómo se podría resolver esto?
Los errores de interferencia de subprocesos se pueden resolver sincronizando el acceso a las variables compartidas. Necesitamos mantener la sincronización de los valores actualizados entre los datos compartidos.
Con esto, veamos el segundo tipo de error
Errores de consistencia de memoria
Los errores de inconsistencia de memoria generalmente ocurren cuando diferentes hilos intentan leer o tienen vistas inconsistentes en el mismo dato. Esto generalmente ocurre cuando el primer subproceso actualiza algunos datos compartidos, y este valor actualizado no se propaga a subprocesos segundos o diferentes, y leen datos antiguos.
Veamos por qué sucede esto?
Bueno, podría haber muchas causas de esto. Por lo general, el compilador generalmente realiza muchas optimizaciones en la aplicación para mejorar el rendimiento. También puede actualizar las secuencias de instrucciones para optimizar el rendimiento. Incluso, en general, los procesadores también intentan optimizar los códigos, por ejemplo, una CPU puede leer el valor actual de una variable desde una memoria caché o un registro temporal en lugar de la memoria principal
Conclusión: ¿Qué es la concurrencia en Java?
La concurrencia es una característica muy importante del lenguaje de cualquier OOP. El enhebrado nos brinda la función de ejecutar múltiples procesos en paralelo entre sí. Nos ayuda a ejecutar nuestra compleja tarea más rápido. Sin embargo, con los profesionales, la concurrencia también tiene pocas desventajas. El uso de subprocesos provoca un uso intensivo de los recursos
Artículos recomendados
Esta ha sido una guía de lo que es la concurrencia en Java. Aquí hemos discutido los problemas y la mejora en la concurrencia con el ejemplo. También puede consultar nuestros otros artículos sugeridos para obtener más información:
- ¿Qué es Multithreading en Java?
- ¿Cómo conectar la base de datos en Java?
- ¿Qué es Multithreading en Java?
- ¿Qué es el J2EE?