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?
java
interview
concurrency
sparc_spread
fuente
fuente
notifyAll()
"No creo en hacer el trabajo del programador del sistema operativo, así que usonotify()
"Respuestas:
Realmente depende de si está preguntando a un candidato con 2 años de experiencia en Java o uno con 7 años de experiencia en Java. Para un arquitecto / líder técnico / senior parecen preguntas apropiadas, pero para un junior y quizás un nivel medio también, parecen un poco difíciles.
También está haciendo preguntas sobre los mecanismos de sincronización de bajo nivel que han sido reemplazados principalmente por el
java.util.concurrent
desarrollo actual de Java; en lugar dewait()/notify()
cerraduras son preferibles. Puede ver que Effective Java 2nd edition ha dejado caer un capítulo que explica en detalle el mecanismo de espera / notificación, porque no se consideró útil. Además, el contenedor maneja subprocesos múltiples en un nivel superior en la mayoría de los casos; los métodos de un EJB son seguros para subprocesos, por ejemplo, sin ninguna preocupación por parte del programador (esto no significa que los programadores no deban conocer el subprocesamiento múltiple).De hecho, veo que los subprocesos múltiples son una subparte de los sistemas operativos en lugar de una subparte de un lenguaje de programación. Para ver si una persona realmente comprende las preguntas de programación de subprocesos múltiples y paralelas sobre mutexes, se deben hacer primero los semáforos o la programación y, finalmente, solo después, detalles sobre la implementación en un lenguaje de programación particular.
fuente
lock
vs.wait/notify
- Lo sabíalock
del libro de Goetz, pero no me di cuenta de que ahora era preferible a la antigua. Sin embargo, estoy de acuerdo con @Martijn en que alguien con este nivel de experiencia debería conocer los enfoques más antiguos. De todos modos, no quiero volver a hacer la pregunta (especialmente porque ya la marqué como contestada por usted :-)) pero creo que alguien con 10 años de experiencia debería poder responder esas preguntas, ¿no?lock
vswait/notify
, los bloqueos son preferibles cuando realmente necesita características de bajo nivel, pero en la mayoría de los casos hay disponible una alternativa de nivel superior; BlockingQueue es especialmente útil.Yo diría que son preguntas relativamente avanzadas. Sin embargo, no son "injustos" en el sentido de que no son preguntas capciosas.
De hecho, la "justicia" no es realmente un criterio relevante. Lo que usted (como entrevistador) debería preocuparse es si las preguntas y su interpretación de las respuestas seleccionan a los mejores candidatos para el puesto o los puestos para los que está entrevistando. (O para decirlo de otra manera, ¿está rechazando candidatos a los que realmente debería considerar más debido a que no responden estas preguntas "correctamente"?)
Nuevamente, esa no es realmente la pregunta relevante. La pregunta que debe hacerse es si necesita a alguien que tenga un buen conocimiento de la recolección de basura de Java.
fuente