Ecco alcune domande che ho recentemente posto agli intervistati che affermano di conoscere la concorrenza Java:
- Spiegare il pericolo della "visibilità della memoria" - il modo in cui la JVM può riordinare determinate operazioni su variabili non protette da un monitor e non dichiarate
volatile
, in modo tale che un thread non possa vedere le modifiche apportate da un altro thread. Di solito lo chiedo mostrando il codice in cui è presente questo pericolo (adNoVisibility
esempio l' esempio nel Listato 3.1 da "Concorrenza in pratica Java" di Goetz et al) e chiedendo cosa non va. - Spiegare in che modo
volatile
influisce non solo sull'effettiva variabile dichiaratavolatile
, ma anche su eventuali modifiche alle variabili apportate da un thread prima che cambi lavolatile
variabile. - Perché potresti usare
volatile
invece disynchronized
? - Implementare una variabile di condizione con
wait()
enotifyAll()
. Spiega perché dovresti usarenotifyAll()
. Spiega perché la variabile condizione dovrebbe essere testata con unwhile
ciclo.
La mia domanda è: sono appropriati o troppo avanzati per chiedere a qualcuno che dice di conoscere la concorrenza Java?
E mentre ci siamo, pensi che qualcuno che lavora nella concorrenza Java dovrebbe avere una conoscenza superiore alla media della raccolta di rifiuti Java?
notifyAll()
con "Non credo nel fare il lavoro dello scheduler del sistema operativo, quindi uso notify()
"