2011-05-22 11 views

risposta

7

No. Volatile indica che la variabile non viene memorizzata nella cache in alcuna cache per thread e il suo valore viene sempre recuperato dalla memoria principale quando necessario. Sincronizzazione significa che quelle cache per-thread verranno mantenute sincronizzate in determinati punti. In teoria, l'uso di una variabile volatile può comportare una grande penalità di velocità se molti thread hanno bisogno di leggere il valore della variabile, ma vengono modificati solo raramente.

+0

Se è necessario un qualche tipo di sincronizzazione, aren' in genere parli di penalita 'della velocità? (In genere non ha molto senso sincronizzare le scritture se non si sincronizzano anche le letture ...) – cHao

1

volatile le variabili non sono sincronizzate (almeno, non nel modo in cui la roba synchronized è sincronizzata). Quello che volatile fa è garantire che una variabile venga recuperata ogni volta che viene utilizzata (ovvero: impedisce determinati tipi di ottimizzazione) e IIRC che viene letta e scritta nell'ordine corretto. Questo potrebbe teoricamente emulare alcuni tipi di sincronizzazione, ma non può funzionare allo stesso modo se il setter deve impostare più di una cosa. (Se si imposta due volatile variabili, per esempio, ci sarà un punto in cui viene impostato e l'altra no.)

0

realtà No.

volatile è in realtà forma più debole di sincronizzazione, quando il campo è dichiarato come volatile il compilatore e il runtime capiscono che questo variable è condiviso e le operazioni su di esso non devono essere riordinate con altre operazioni di memoria. Le variabili volatili non vengono memorizzate nella cache nei registri o nelle cache in cui sono nascoste da altri processori, pertanto una lettura di una variabile volatile restituisce sempre una scrittura recente da qualsiasi thread.

0

solo un esempio:

First thread run : 
while(stopped){ 
... do something 
} 

Second thread run : 
stopped = true; 

è utile dichiarare fermato come un valore booleano volatile per il primo thread di avere un valore fresco di esso.

4

No, chiamare un metodo synchronized getXXX/setXXX non equivale a leggere/scrivere su una variabile volatile.

Più thread possono contemporaneamente leggere o scrivere su una variabile volatile. Ma solo un thread alla volta può leggere o scrivere su una variabile protetta da un blocco synchronized.

0

Nessuna relazione.

Fondamentalmente

  • Volatile => recupera sempre ultimo valore del parametro
  • sincronizzato => serve solo 1 filo contemporaneamente