2010-07-09 15 views
13

Una variabile a cui si accede da più thread, ma solo all'interno di blocchi sincronizzati, necessita del modificatore volatile? Se no, perché?Modificatore volatile Java e blocchi sincronizzati

+1

Questa domanda potrebbe anche interessare: http://stackoverflow.com/questions/3103204/difference-between-synchronization-of-field-reads-and-volatile –

+0

No. Fare riferimento a questa domanda SE relaled: http : //stackoverflow.com/questions/3519664/difference-between-volatile-and-synchronized-in-java/34355995#34355995 –

risposta

8

Non è necessario utilizzare volatile all'interno di synchronized, sincronizzato garantisce già il comportamento corretto per la memorizzazione nella cache locale delle variabili se utilizzato in modo coerente (su ogni accesso).

volatile funziona su valori primitivi e può essere una bella scorciatoia per accessi atomici a un tipo primitivo. Si noti che il comportamento di volatile è cambiato in JDK 5 a partire da 1.4.

Maggiori informazioni si possono trovare here

4

No. Quando si lavora all'interno di un blocco sincronizzato, tutte le variabili memorizzate nella cache sono sincronizzate all'accesso, poiché crea una barriera di memoria.

Per i dettagli, vedere questo confronto (con discussione) di volatile to synchronized.

2

blocchi che sincronizzano sullo stesso oggetto (o metodo) sono garantiti per non essere eseguito allo stesso tempo. Quindi, finché si esegue la sincronizzazione con lo stesso oggetto, la variabile non avrà mai accessi simultanei, quindi non è necessario un trattamento speciale.

Se gli accessi non sono sincronizzati, si ha una condizione di competizione. Rendere la variabile volatile può essere corretta per alcune variabili primitive (io rimando ad altri post per maggiori informazioni su volaitle). Se questo non è utile, quasi sicuramente hai un bug.

+1

Per essere pedante, la sincronizzazione in altre lingue non implica la memoria coerente: il valore può essere memorizzato nella cache in un registrati o memoria locale, e anche se l'accesso è sincronizzato, potrebbe non essere atomico/coerente. Tuttavia, in Java, la sincronizzazione attiva un volatile automatico. –

+1

Per essere ugualmente pedante, le altre lingue che probabilmente stai pensando (C/C++) non hanno una nozione intrinseca di sincronizzazione dei thread o anche una parola chiave 'synchronized'; devi costruire qualcosa di simile fuori mutex. Hai ragione: non c'è runtime per gestire la consistenza della memoria per te. Quelle lingue non specificano nemmeno alcuna semantica per gli accessi alla memoria concomitanti! Fortunatamente Java è bello e fa esattamente ciò che ti aspetti che faccia. – Karmastan

+0

@YannRamin Come in, la variabile su cui si sincronizza è effettivamente volatile ai fini delle modifiche apportate all'interno di quel blocco sincronizzato? Non so se ti ho interpretato correttamente, ma non riesco a trovare una descrizione di quell'effetto altrove. – spieden