2011-12-14 11 views
6

Voglio sapere se la creazione di un nuovo thread in Java attiva un flush della cache. Supponiamo che faccio qualcosa di simile, in questa sequenza:La creazione di una nuova discussione ha un effetto collaterale sullo svuotamento della cache?

  1. A corre filo e imposta una variabile X.
  2. Il filo crea un nuovo thread.
  3. Il nuovo thread accede X.

mia domanda è questa: è il nuovo thread, sia nel momento in cui viene creato o nel momento in cui inizia l'esecuzione, garantito per vedere l'aggiornamento fatto per X da parte del thread precedente nel passaggio 1? Capisco che se il vecchio thread cambia il valore di X in futuro, non è garantito che il nuovo thread vedrà queste modifiche. Va bene. Voglio solo sapere se il nuovo thread vedrà i giusti valori quando si avvia senza necessità di sincronizzazione esplicita.

Quando ho deciso di esaminare questo argomento, ho pensato che una semplice ricerca su google avrebbe rivelato immediatamente la risposta, ma per qualche motivo, non riesco a trovare alcun risultato che risolva questa domanda.

+3

Perché si basano su tali garanzie oscuri (se esistono tutto) se si può semplicemente rendere la variabile in questione 'volatile'? – delnan

+5

@delnan: non c'è nulla di oscuro qui. Questo comportamento è chiaramente specificato nelle specifiche del linguaggio Java. –

+0

Ora una domanda di garanzia più oscura potrebbe essere: "A scrive X; B creato; C legge X" - il comportamento di questo è definito? :-) –

risposta

9

Sì, lo è.

In java, esiste una relazione 'happen-before' che specifica quali effetti di memoria sono visibili tra due azioni. Se "A accade prima di B", l'azione B è garantita per vedere tutte le modifiche apportate dall'azione A.

L'avvio di una discussione crea una relazione "precedente a prima" tra la chiamata "thread.start()" e tutto il codice che esegue sul nuovo thread. La nuova discussione è quindi garantita per vedere l'effetto memoria della modifica della variabile X sul primo thread.

Per una rapida panoramica della relazione before-before, vedere Memory Visibility parte della panoramica del pacchetto java.util.concurrent. Nel tuo caso, i bit interessanti sono:

  • Ogni azione in un thread avviene prima di ogni azione in quel thread che viene in seguito nell'ordine del programma.
  • Si verifica una chiamata all'avvio su un thread, prima di qualsiasi azione nel thread avviato.

Altri link se siete curiosi:

+0

Una bella risposta, tuttavia, la lettura di questa sinossi non mi rende chiaro se questo è definito: i thread esistono, 'A, B, la variabile X è sconosciuta'. 'A scrive X; B crea C; C legge X'. Si noti che 'C' è stato creato da' B' e non 'A' - quindi non succede - prima con A e C? (Si prega di notare che questo * non * è quello che chiede la domanda originale, a cui questa domanda risponde, solo meditando! :-) –

+0

@pst: sì, hai ragione. In questo caso non è possibile, prima tra le azioni "A scrive X" e "C legge X". –

+0

@ PeterŠtibraný: vuoi dire che c'è _is_ accade-prima tra "B crea C" e "C legge X", ma non tra "A scrive X" e qualsiasi altra azione in B o C. – ninjalj

Problemi correlati