Desarrollador Java: pregunta de entrevista
¿Cómo haces thread-safe un código Java?
La seguridad entre hilos exige proteger invariantes compartidos mediante inmutabilidad, confinamiento, atómicos, locks o colecciones concurrentes; importan visibilidad y operaciones compuestas.
Respuesta directa
Qué debe cubrir una buena respuesta
Cómo funciona
La seguridad entre hilos trata de invariantes, no de sentencias sueltas. El modelo de memoria de Java solo garantiza que un hilo ve las escrituras de otro mediante sincronización, volatile o las relaciones happens-before que establece java.util.concurrent. Los diseños seguros más baratos evitan compartir: objetos inmutables, confinamiento a un hilo y paso de mensajes. Cuando hay que compartir, las clases atómicas cubren variables sueltas, las colecciones concurrentes cubren maps y colas, y los locks explícitos protegen operaciones compuestas como comprobar y actuar.
Ejemplo
Un contador incrementado con count++ desde muchos hilos pierde actualizaciones porque el incremento son tres operaciones; sustituirlo por AtomicLong o LongAdder lo arregla sin lock. Una caché hecha con HashMap y get y put sincronizados sigue mal para la semántica putIfAbsent, mientras que ConcurrentHashMap.computeIfAbsent hace la comprobación y la inserción de forma atómica.
Errores frecuentes
- Marcar un campo volatile y suponer que las actualizaciones compuestas sobre él son atómicas.
- Sincronizar todos los métodos y crear un cuello de botella en lugar de proteger el invariante concreto.
- Publicar un objeto a medio construir a otro hilo al filtrar this desde el constructor.
Una estructura útil para responder
Responde desde tu propia experiencia.
No memorices un guion: usa solo ejemplos que puedas explicar con honestidad en preguntas posteriores.
Abre el espacio de trabajo de escritorio y ensaya una respuesta clara con tus propias palabras.