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 (porNoVisibilityexemplo, o exemplo na Listagem 3.1 de "Java Concurrency in Practice" de Goetz et al) e perguntando o que está errado. - Explique como
volatileafeta não apenas a variável real declaradavolatile, mas também quaisquer alterações nas variáveis feitas por um encadeamento antes de alterar avolatilevariável. - Por que você pode usar em
volatilevez 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 umwhileloop.
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?
notifyAll()com "Eu não acredito em fazer o trabalho do programador OS, então eu uso notify()"