Unas pistas para el problema de concurrencia

En el último artículo, presentamos un problema de concurrencia para que lo resolvieses. Aquí damos algunas pistas para ayudar a que averigües qué sucede.

[box style=»1″]

Éste artículo es una traducción al castellano de la entrada original publicada, en inglés, por Dr. Heinz Kabutz en su número 241b de The Javatm Specialists’ Newsletter. Puedes consultar el texto original en Javaspecialists’ Newsletter #241:b Concurrency Puzzle Useful Hints

Este artículo se publica traducido en adictos, con permiso del autor, por David Gómez García, (@dgomezg) consultor tecnológico en Autentia, colaborador de JavaSpecialists y instructor certificado para impartir los cursos de JavaSpecialists.
[/box]

Un problema de concurrencia – Unas pistas útiles.

Muchas gracias a todos los que ya me han enviado por correo su solución al problema de la semana pasada. La mayoría de las respuestas eran correctas en teoría, pero incorrectas en la práctica 🙂 . Por mi experiencia es mejor aprender practicando, más que observando a otro. Por eso, sacarás más beneficio intentando resolverlo que leyendo mi solución. Así que, si aún no lo has intentado o te has quedado bloqueado en algún punto, aquí te dejo algunas pistas útiles:

  1. Podemos discutir la corrección utilizando el Java Memory Model (JMM). No obstante, la mayoría de los problemas de concurrencia que se pueden presentar con happens-before, early-writes, visibilidad, etc… son muy difíciles de reproducir. Seguramente nos sería difícil escribir un test que fallase de forma consistente con este. Esa es la primera pista.
  2. La segunda pista pasa por no creer nunca lo que te dicen tus clientes que es el problema. La explicación con

    Text
    System.arraycopy()

    es claramente una «pista falsa». Para ser justos, Jack me lo envió como una posible explicación. No obstante, no miré al código de

    Text
    System.arraycopy()

    porque realmente no creía que la razón del fallo fuese a estar allí. Así que puedes ignorar el

    Text
    System.arraycopy()

    . Puedes comprobar que si arrancas con un array mayor de 1000, también falla.

  3. Siempre que tratamos de resolver problemas de concurrencia, debemos ser capaces de reproducir el error primero. Esto puede implicar que necesitemos buscar otro hardware que muestre el problema (es lo que yo hice). Una vez que lo ves producirse, cambia el código poco a poco comprobando si todavía se reproduce.
  4. Última pista. La solución a este problema es increíblemente simple. De veras, cualquier desarrollador Java puede solucionarlo, no sólo los gurús de la concurrencia. Hay un pequeño efecto colateral que está prohibido con Swift 3 y que es el que causa la condición de carrera. No hay más pistas 😉

También sugerí que utilizases

Text
StampedLock

para escribir este código de forma correcta. Admito que esto es un poquito más difícil que resolver el problema.

Text
StampedLock

tiene tres formas base de utilizar

Text
add()

,

Text
remove()

y

Text
get()

según su JavaDoc. Cuando lo tengas, por favor, envíamelo por correo y tendrás tu oportunidad de contribuir a nuestra solución y poner tu nombre en los créditos.

Saludos

Heinz.

Comentarios

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

He leído y acepto la política de privacidad

Información básica acerca de la protección de datos

  • Responsable: IZERTIS S.A.
  • Finalidad: Envío información de carácter administrativa, técnica, organizativa y/o comercial sobre los productos y servicios sobre los que se nos consulta.
  • Legitimación: Consentimiento del interesado
  • Destinatarios: Otras empresas del Grupo IZERTIS. Encargados del tratamiento.
  • Derechos: Acceso, rectificación, supresión, cancelación, limitación y portabilidad de los datos.
  • Más información: Puedes ampliar información acerca de la protección de datos en el siguiente enlace:política de privacidad

Heinz es el creador de "The Java Specialists' Newsletter".
Doctor en Informática, Heinz ha participado en el desarrollo de grandes aplicaciones en Java, ha formado a miles de desarrolladores profesionales y es ponente habitual en las principales conferencias sobre Java.
Reconocido como Java Champion por Sun Microsystems -los creadores de Java- por su trabajo en mejorar Java, Heinz imparte cursos de JavaSpecialists.eu por todo el mundo, de forma remota y presencial. Es autor de dichos cursos, incluidos 'Java Specialists Master', 'DesignPatterns and Concurrency Specialists' y 'Performance and Concurrency for Java 8'.

¿Quieres publicar en Adictos al trabajo?

Te puede interesar

Aprende cómo migrar tu sitio Joomla 3 a Joomla 5 de forma segura, manteniendo el diseño, la funcionalidad y compatibilidad con extensiones. Una guía paso a paso con recomendaciones, imágenes y buenas prácticas para actualizar sin sorpresas.
Descubre qué es Yocto Project, sus ventajas, usos reales en Izertis y cómo crear tu propia distribución Linux para Raspberry Pi paso a paso, de forma sencilla y flexible.
¿Trabajas con Drupal y SonarQube 9.9? En este artículo exploramos cómo adaptar el análisis estático para evitar falsos positivos, desactivar reglas conflictivas del Quality Profile y delegar el estilo a PHP CodeSniffer. Una guía práctica para mejorar la integración sin depender aún de SonarQube 10.