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?
notifyAll()
com "Eu não acredito em fazer o trabalho do programador OS, então eu uso notify()
"