Hola colegas
El artículo, cuya traducción ofrecemos hoy, una vez más recuerda la importancia del libro eterno "
La concurrencia de Java en la práctica ", escrito por Brian Goetz.
Las fechas de los comentarios sobre este artículo en el original sugieren que el autor no lo actualiza ni lo vuelve a publicar por primera vez. Por lo tanto, también nos permitimos actualizar el enlace al libro mencionado en el artículo de Raul-Gabriel Urm, Mario Fusco y Alan Mycroft, que fue publicado por Manning bajo el título Java 8 en acción. Estamos preparando una traducción de una nueva edición llamada Modern Java. Pero por ahora, hablemos de los clásicos. Estás invitado a gato.
Un lector con el apodo Shobhit me hizo esta pregunta en los comentarios sobre un artículo sobre
12 libros avanzados de Java para programadores de nivel medio - parte 1 . La pregunta es realmente buena, y creo que muchos programadores de Java tenían dudas similares cuando en nuestro tiempo alguien recomendó que leyeran
la concurrencia de Java en la práctica . Cuando este libro se publicó por primera vez, en 2006, todo el mundo de Java todavía no podía descubrir las innovaciones en el campo de la competencia realizadas en Java 1.5. Creo que entonces se hizo el primer intento serio de mejorar el soporte integrado de Java para multihilo y competitividad. Luego, muchos programadores ni siquiera sospecharon sobre las nuevas herramientas que aparecieron en la API, por ejemplo, sobre
CountDownLatch ,
CyclicBarrier ,
ConcurrentHashMap
y muchas otras. El libro les sirvió como una introducción depurada para trabajar con estas herramientas, y explicaba cómo usarlas para escribir aplicaciones Java competitivas de alto rendimiento.
Esta es exactamente la idea general de este libro, y en este sentido muchos desarrolladores se la describirán si pregunta "¿Qué le parece" La concurrencia de Java en la práctica "? Sin embargo, tomo este libro de manera un poco diferente, y es por eso que
todavía lo recomiendo a todos los recién llegados que estén familiarizados con Java, o desarrolladores de nivel medio que quieran aprender conceptos relacionados con la competencia.
El material más importante que le presentará este libro es conceptos claros y fundamentos de la programación competitiva, en particular, visibilidad, pedidos,
seguridad de hilos ,
inmutabilidad , concurrencia, etc.
También explica por qué, en la mayoría de los casos, las aplicaciones Java competitivas se escriben incorrectamente, por qué los programadores de Java cometen errores comunes que conducen a problemas de subprocesos múltiples, que incluyen condiciones de carrera, punto muerto, bloqueo activo, interferencia de memoria y simplemente cálculos incorrectos.
El libro utiliza emoticones que acompañan la descripción de "cómo hacerlo mal", antes de presentar al lector la solución correcta y de alta calidad al problema. Por lo tanto, el libro no solo ayuda a lidiar con los conceptos erróneos que tienen muchos desarrolladores de Java, sino también a inculcar en la comunidad de Java la información correcta sobre cómo trabajar con subprocesos múltiples y competencia.
No hay duda de que los subprocesos múltiples y la competencia son complejos. No son fáciles de implementar correctamente en el código; es igualmente difícil de entender y explicar. Conozco a muchos programadores que simplemente no pueden representar visualmente cómo los diferentes hilos interactúan con el mismo elemento de código, operando con datos diferentes.
Al igual que el ejemplo clásico de recursión, el subprocesamiento múltiple es muy fácil de practicar para algunos programadores, mientras que para otros, el subprocesamiento múltiple es difícil de comprender y aplicar en un escenario de aplicación.
La mayor contribución del libro de Java Concurrencia en la práctica al desarrollo del mundo de Java no es simplificar la competencia, sino proporcionar información verdadera y precisa sobre la que faltaba. Desde entonces, he realizado muchas entrevistas y sé que los programadores no siempre imaginan con precisión el dispositivo de flujo y cómo funcionan.
Muchos programadores que incluso lograron trabajar con Java durante 4-5 años no entienden
cómo se organizan las variables volátiles ; todo lo que saben es que cuando se trabaja con una variable mutable, debe verificar con cada comparación qué valor hay en la memoria principal. Esto es cierto, pero solo una parte de la verdad.
No se les informó sobre el modelo de memoria Java, sobre cómo una variable variable puede afectar el orden del código y la ejecución de instrucciones computacionales en su núcleo. Se trata de utilizar la compilación dinámica (
JIT ) y la máquina virtual Java (
JVM ) para la optimización; Tal optimización puede conducir a errores lógicos sutiles.
A las personas no se les dice cómo las variables mutables le permiten ver lo que se hizo en un subproceso antes de acceder a una variable desde otro subproceso, etc. No todos saben qué es una barrera de memoria y cómo afecta la visibilidad.
Es del libro Java Concurrency in Practice que muchos programadores de Java han estudiado todos estos conceptos. Debo admitir que yo mismo, hasta que lo leí, estaba equivocado en muchos aspectos sobre muchos temas importantes de subprocesamiento múltiple y competencia, en particular, la secuencia, la visibilidad y los efectos implícitos de las variables finales y la publicación segura. El libro me ayudó a resolver esto.
Por cierto, si algunas secciones del libro te parecen un poco incomprensibles, créeme, no solo a ti. Aquí agradecemos al Dr. Heinz Kabutz, quien resumió el material del libro en una forma simplificada en su curso
Java Concurrency in Practice Bundle .

Incluso si este material le parece demasiado complicado, Heinz tiene otro curso,
Mastering Threads , que ayuda a comprender el multihilo para cualquier programador Java promedio.
Ahora hablemos de Java 8, es decir, lo que ha cambiado de Java 1.5 a Java 8. Han aparecido muchas herramientas nuevas en el JDK para introducir competitividad y diseñar aplicaciones Java más competitivas. El grupo
fork-join ha aparecido en JDK 7
y CompleteableFutures
en Java 8. Es mucho más importante que, comenzando con Java 8, se haya arreglado un nuevo estilo de programación más funcional, provisto con
expresiones lambda .
También tenemos transmisiones y transmisiones paralelas, lo que permite a los desarrolladores aprovechar la competitividad sin programarla. La idea de tomar la implementación de la competencia de los desarrolladores de aplicaciones y delegarla a los desarrolladores de la API simplifica ligeramente la situación con la competencia en Java y reduce los riesgos de su implementación.
Esto también significa que en Java puede realizar operaciones masivas en varios subprocesos utilizando solo un par de métodos, sin escribir una sola línea de código relacionada con los subprocesos, la palabra clave sincronizada o esperar y notificar métodos.
Sin lugar a dudas, cualquier desarrollador de Java necesita aprender estas nuevas herramientas para mantenerse al día con el desarrollo de la tecnología, lo que, por supuesto, ayudará a un libro como
Modern Java In Action . No solo le presentará todas las innovaciones del lenguaje Java, sino que también lo ayudará a aprender cómo usarlas en las tareas cotidianas, comprender la motivación de estas innovaciones y tener una idea general del lenguaje Java moderno.

Aunque el libro Java Concurrency in Practice en su forma actual no cubre todos estos conceptos y herramientas importantes, sigue siendo invaluable para explorar las características clave del lenguaje Java relacionadas con
hilos ,
competencia y
subprocesos múltiples .
El libro de Götz sigue siendo una lectura obligada para cualquier desarrollador de Java que quiera aprender y dominar el multihilo y la competitividad, las mayores fortalezas de Java en el desarrollo de aplicaciones.
Basado en lo anterior, a mí, como a muchos desarrolladores de Java de todo el mundo, me gustaría ver la edición actualizada de Java Concurrency in Practice, que consideraría las herramientas y metodologías que aparecieron en Java 6, 7, 8, 9, 10 y tal vez incluso en Java 11. Después de todo,
han aparecido versiones actualizadas de los
patrones de diseño de
Effective Java y
Head First , que cubren Java 8 y demuestran lo fácil que es implementar varios patrones usando las nuevas características de Java 8.