Java LockSupport memoria Consistenza
-
21-09-2019 - |
Domanda
Java 6 domanda API. Ha chiamando LockSupport.unpark(thread)
ha un accade-prima rapporto con il ritorno dalla LockSupport.park
nel thread appena parcheggiati? Ho il forte sospetto che la risposta è sì, ma il Javadoc non sembra parlare in modo esplicito.
Soluzione
Ho guardato se il codice JDK e sembra che i metodi LockSupport sono normalmente chiamati al di fuori di blocchi di sincronizzazione. Quindi, la tua ipotesi sembra essere corretta.
Altri suggerimenti
Ho appena trovato questa domanda, perché mi chiedevo la stessa cosa. Secondo questo articolo da Oracle ricercatore David Dice , la risposta sembra essere non . Ecco la parte rilevante di questo articolo:
Se un thread è bloccato in
park()
stiamo garantito che un successivounpark()
renderà pronto. Un perfettamente legale, ma di bassa qualità attuazionepark()
eunpark()
sarebbe metodi vuoti, in cui il programma degenera in semplice filatura. Un fatto che è il cartina di tornasole per il corretto utilizzopark()
-unpark()
.
vuoti park()
e unpark()
metodi non danno voi qualsiasi accade-prima di relazione garanzie, quindi per il vostro programma per essere portabile 100%, non si dovrebbe fare affidamento su di loro.
Poi di nuovo, il Javadoc di LockSupport dice:
Questi metodi sono progettati per essere utilizzati come strumenti per la creazione di utilità di sincronizzazione di livello superiore, e non sono di per sé utile per molte applicazioni controllo della concorrenza. Il metodo è
park
progettata per l'uso in costruzioni di forma:
while (!canProceed()) { ... LockSupport.park(this); }
Dal momento che si controlla in modo esplicito alcune condizioni in ogni caso, che sia coinvolgerà volatile
o variabili correttamente sincronizzati, le garanzie deboli della park()
non dovrebbero essere effettivamente problema, giusto?
Se non è documentato come tale allora non si può fare affidamento su di essa la creazione di un rapporto avviene prima.
In particolare LockSupport.java in Hotspot codice chiama semplicemente Unsafe.park e .unpark!
accade-prima rapporto saranno generalmente provengono da una coppia di scrittura-lettura su una bandiera di stato volatile o qualcosa di simile.
Ricordate, se non è documentato come la creazione di un accade-prima rapporto allora si deve trattarlo come se non anche se si può dimostrare che lo fa sul vostro sistema specifico. sistemi futuri e implementazioni non può. Si lasciarono che la libertà per una buona ragione.