volatile fa il seguente:
- E impedisce la memorizzazione nella cache i valori nel thread.
- Si assicura che i thread con le copie dei valori dei campi dell'oggetto si riconcilino con la copia principale presente nella memoria.
- Assicurarsi che i dati vengano scritti direttamente nella memoria e letti dalla memoria stessa.
## Ma la condizione in cui viene a mancare volatili:
- Fare un Non-Atomic statement Volatile
.
Esempio:
int count = 0;
count++; // Increment operator is Not Atomic in java
## Opzione migliore:
1. sua sempre meglio seguire la Brian's Rule
:
When ever we write a variable which is next to be read by another thread, or when we are reading a variable which is written just by another thread, it needs to be synchronized. The shared fields must be made private, making the read and write methods/atomic statements synchronized.
2. Seconda opzione è utilizzare il Atomic Classes
, come AtomicInteger, AtomicLong, AtomicReference, ecc
## Vedi questo link, ho fatto una domanda simile come la tua:
Why Volatile is behaving weirdly
fonte
2012-11-28 05:32:20
Consiglio vivamente di leggere "Concurrency Java in pratica" di Brian Goetz. È su Amazon: http://www.amazon.com/Java-Concurrency-Practice-Brian-Goetz/dp/0321349601/ref=sr_1_1?ie=UTF8&qid=1354080774&sr=8-1&keywords=java+concurrency+in+prodice –
È un libro eccellente che demistificherà praticamente tutto ciò che riguarda la memoria e i modelli di threading di Java. –