Abbiamo iniziato a vietare l'uso di volatile
nelle nostre fonti perché è molto semplice scrivere codice che non sempre funziona come previsto.
Nella mia esperienza, le persone aggiungono volatilità per condividere un valore tra i thread. E poi, qualcun altro inizia a modificare il valore. E la maggior parte delle volte funziona. Ma in produzione, inizi a ottenere errori strani che sono davvero difficili da rintracciare. I contatori vengono incrementati di 100'000 volte (i test li incrementano solo 10 volte) ma finiscono a 99'997. In Java 1.4, i valori lunghi potrebbero essere corrotti davvero, molto raramente.
Le classi di supporto Atomic*
, d'altra parte, solo imporre un piccolo overhead e funzionano sempre come pubblicizzato.
Quindi, se non avete una buona ragione (*) da utilizzare volatile
, preferire sempre le classi di supporto Atomic*
.
Se non si sa esattamente che cosa ogni personaggio nelle classi di supporto Atomic*
fa, allora si dovrebbe davvero evitare di volatile
.
*: l'ottimizzazione prematura non è mai una buona ragione.
fonte
2012-10-12 12:43:36
Dal momento che uno lo ha menzionato (né qui né sul duplicato): w/classi atomiche si ha un metodo elegante lazySet. Sulla maggior parte delle architetture supera la scrittura volatile di base (ma non ha la stessa semantica). Fondamentalmente lazySet non ha bisogno di svuotare i buffer di scrittura della CPU, il che è abbastanza buono in quanto possono essere scaricati mentre la CPU è in stallo. – bestsss