Aqui estão algumas perguntas que fiz recentemente a entrevistados que dizem conhecer a simultaneidade Java:
- Explique o risco de "visibilidade da memória" - a maneira como a JVM pode reordenar certas operações em variáveis desprotegidas por um monitor e não declaradas
volatile
, de modo que um encadeamento possa não ver as alterações feitas por outro encadeamento. Normalmente, pergunto a este, mostrando o código onde esse risco está presente (porNoVisibility
exemplo, o exemplo na Listagem 3.1 de "Java Concurrency in Practice" de Goetz et al) e perguntando o que está errado. - Explique como
volatile
afeta não apenas a variável real declaradavolatile
, mas também quaisquer alterações nas variáveis feitas por um encadeamento antes de alterar avolatile
variável. - Por que você pode usar em
volatile
vez desynchronized
? - Implemente uma variável de condição com
wait()
enotifyAll()
. Explique por que você deve usarnotifyAll()
. Explique por que a variável de condição deve ser testada com umwhile
loop.
Minha pergunta é: são apropriadas ou avançadas demais para perguntar a alguém que diz conhecer a simultaneidade Java?
E enquanto estamos nisso, você acha que alguém que trabalha com simultaneidade Java deve ter um conhecimento acima da média da coleta de lixo Java?
java
interview
concurrency
sparc_spread
fonte
fonte
notifyAll()
com "Eu não acredito em fazer o trabalho do programador OS, então eu usonotify()
"Respostas:
Realmente depende se você está perguntando a um candidato com 2 anos de experiência em Java ou um com 7 anos de experiência em Java. Para um arquiteto / líder técnico / sênior, eles parecem perguntas apropriadas, mas para um júnior e talvez também para um intermediário, eles parecem meio difíceis.
Você também está fazendo perguntas sobre mecanismos de sincronização de baixo nível que foram substituídos principalmente pelo
java.util.concurrent
desenvolvimento Java atual; em vez dewait()/notify()
bloqueios são os preferidos. Você pode ver que o Effective Java 2nd edition descartou um capítulo que explicava o mecanismo de espera / notificação em detalhes, porque não era considerado útil. Além disso, o contêiner lida com multithreading em um nível mais alto na maioria dos casos; os métodos de um EJB são seguros para threads, por exemplo, sem nenhuma preocupação do programador (isso não significa que os programadores não devam conhecer multithreading).Na verdade, vejo que o multithreading é uma subparte dos sistemas operacionais, e não uma subparte de uma linguagem de programação. Para verificar se uma pessoa realmente entende questões de programação paralela e multithreading sobre mutexes, semáforos ou agendamento, deve ser perguntado primeiro e somente eventualmente, detalhes sobre a implementação em uma linguagem de programação específica.
fonte
lock
vs.wait/notify
- eu sabia sobrelock
o livro do Goetz, mas não percebi que agora era preferível ao antigo. Concordo com @Martijn, no entanto, que alguém com esse nível de experiência deve estar ciente das abordagens mais antigas. Enfim, não pretendo fazer a pergunta novamente (especialmente porque já a marquei como respondida - por você :-)), mas acho que alguém com 10 anos de experiência deve ser capaz de responder a essas perguntas, não?lock
vswait/notify
, os bloqueios são preferidos quando você realmente precisa de recursos de baixo nível, mas na maioria dos casos uma alternativa de nível superior está disponível; BlockingQueue é especialmente útil.Eu diria que são perguntas relativamente avançadas. No entanto, eles não são "injustos" no sentido de que não são perguntas complicadas.
De fato, "justiça" não é realmente um critério relevante. O que você (como entrevistador) deve se preocupar é se as perguntas e sua interpretação das respostas estão selecionando os melhores candidatos para a posição ou posições para as quais você está entrevistando. (Ou, em outras palavras, você está rejeitando os candidatos que realmente deveria dar mais atenção, porque eles não responderam "corretamente" a essas perguntas?)
Novamente, essa não é realmente a questão relevante. A pergunta que você deve se perguntar é se precisa de alguém que tenha um bom conhecimento da coleta de lixo do Java.
fonte