Aquí hay algunas preguntas que les hice recientemente a los entrevistados que dicen conocer la concurrencia de Java:
- Explique el peligro de "visibilidad de la memoria": la forma en que la JVM puede reordenar ciertas operaciones en variables que no están protegidas por un monitor y no declaradas
volatile
, de modo que un subproceso puede no ver los cambios realizados por otro subproceso. Por lo general, le pregunto a este mostrando el código donde está presente este peligro (porNoVisibility
ejemplo, el ejemplo en el Listado 3.1 de "Concurrencia de Java en la práctica" por Goetz et al) y preguntando qué está mal. - Explique cómo
volatile
afecta no solo la variable real declaradavolatile
, sino también cualquier cambio en las variables realizado por un hilo antes de que cambie lavolatile
variable. - ¿Por qué podrías usar en
volatile
lugar desynchronized
? - Implementar una variable de condición con
wait()
ynotifyAll()
. Explica por qué deberías usarlonotifyAll()
. Explica por qué la variable de condición debe probarse con unwhile
bucle.
Mi pregunta es: ¿son apropiados o demasiado avanzados para preguntarle a alguien que dice que conoce la concurrencia de Java?
Y mientras lo hacemos, ¿crees que se debería esperar que alguien que trabaja en la concurrencia de Java tenga un conocimiento superior al promedio de la recolección de basura de Java?
notifyAll()
"No creo en hacer el trabajo del programador del sistema operativo, así que uso notify()
"