2010-10-19 17 views
12

ho due thread:variabili volatili e avviene prima di ordinare

Discussione: 1

a = 1; 
x = b; 

Discussione: 2

b = 1 
y = a 

Qui a e b sono dichiarati volatile. Non ho capito come si crea un margine "happen-before" tra a = 1; e y = a; e tra x = b; e b = 1;

Capisco che utilizzando la variabile volatile si possa impedire la lettura di valori obsoleti dalla cache dei thread. Ma come può accadere una variabile volatile, prima di ordinare.

Specificamente, non ho capito questo:

una scrittura ad un campo volatili accade prima di ogni lettura successiva dello stesso campo .

Hoe funziona?

+0

Vedere questa domanda recente e rispondere per molte informazioni rilevanti: http://stackoverflow.com/questions/3964317/memory-barriers-and-coding-style-over-a-java-vm – andersoj

risposta

15

una scrittura in un campo volatile avviene prima di ogni successiva lettura dello stesso campo.

La parola importante qui è "successiva".

Ecco il bit rilevante del linguaggio Java Specification 17.4.4 Synchronization Order:

Ogni esecuzione ha un ordine di sincronizzazione. Un ordine di sincronizzazione è un ordine totale su tutte le azioni di sincronizzazione di un'esecuzione. Per ciascun thread t, l'ordine di sincronizzazione delle azioni di sincronizzazione (§17.4.2) in t è coerente con l'ordine di programma (§17.4.3) di t. azioni sincronizzazione inducono l'sincronizzato con-relazione sulle azioni, definita come segue:

  • [...]
  • Una scrittura ad una variabile volatile (§8.3.1.4) sincronizza con-v tutte le letture successive di v da qualsiasi thread (dove successivo viene definito in base all'ordine di sincronizzazione).

Nota l'ultima parte. Quindi sta dicendo che se si considera un ordinamento totale delle azioni del programma, qualsiasi lettura di una variabile volatile che viene in seguito in quell'ordine totale di una scrittura non può "perdere" la scrittura.

+0

"* Per ogni thread t *, l'ordine di sincronizzazione delle azioni di sincronizzazione ... "volatile di per sé non determina l'ordine di sincronizzazione tra i thread, vero? –

+0

Anch'io ho la stessa domanda. Trovare le specifiche Java è un po 'criptico. – devnull

+1

@pst: Volatile opera sull'ordine * total *, anziché sull'ordine per un thread specifico. Significa in effetti che un thread non può leggere una variabile volatile senza verificare se altri thread hanno eseguito una scrittura. –

3

una scrittura un campo volatili avviene prima di ogni successivo lettura dello stesso campo.

Questo testo è la confusione. Limita la relazione prima-accade alle scritture che avvengono prima della lettura! Dice solo che si legge che succede dopo, in realtà accade dopo. In altre parole, quello che sta cercando di dire è che la lettura non avviene durante la la scrittura, e anche che se ci sono altre relazioni prima che causano la lettura che si verificano dopo la scrittura, che la leggere avrà il valore di quella scrittura.

Vedere la sezione JLS 17.4.4 Synchronization Order che definisce la parola "successivo" in questo contesto.

3

Per analizzare, innanzitutto elencare tutti gli ordini di sincronizzazione possibili. devono essere coerenti con l'ordine di programmazione. Nel tuo esempio, ci sono 6 ordini possibili.

1  2  3  4  5  6 
w(a) w(a) w(b) w(a) w(b) w(b) 
r(b) w(b) w(a) w(b) w(a) r(a) 
w(b) r(b) r(b) r(a) r(a) w(a) 
r(a) r(a) r(a) r(b) r(b) r(b) 

Ogni ordine stabilisce alcune relazioni di avvenimenti prima. In (1), abbiamo w (a) succede-prima di r (a). In (6), abbiamo w (b) succede-prima di r (b). In (2) - (5), abbiamo entrambi.

Per ogni ordine possibile, date le relazioni di avvenimento-prima stabilite da esso, è necessario analizzare l'esecuzione per assicurarsi che faccia ciò che si desidera.

Se sembra troppo difficile, lo è. Nella vita reale, di solito ci limitiamo a situazioni più semplici, in cui solo un oggetto è bloccato/rilasciato, o solo una variabile volatile viene letta e scritta. Quindi non è troppo complesso.

Problemi correlati