Hemos comenzado a prohibir el uso de volatile
en nuestras fuentes porque es muy fácil escribir código que no siempre funciona como se esperaba.
En mi experiencia, las personas agregan volátiles para compartir un valor entre subprocesos. Y luego, alguien más comienza a modificar el valor. Y la mayor parte del tiempo, esto funciona. Pero en producción, comienzas a obtener errores extraños que son realmente difíciles de rastrear. Los contadores se incrementan 100'000 veces (las pruebas solo los incrementan 10 veces) pero terminan en 99'997. En Java 1.4, los valores largos podrían corromperse realmente, muy raramente.
Las clases de ayuda Atomic*
, por otro lado, imponen solo una pequeña sobrecarga y siempre funcionan como se anuncia.
De modo que a menos que tenga una muy buena razón (*) para usar volatile
, siempre prefiera las clases de ayuda Atomic*
.
Si no sabe exactamente lo que hace cada carácter en las clases de ayuda Atomic*
, entonces realmente debe evitar volatile
.
*: La optimización prematura nunca es una buena razón.
Dado que uno lo ha mencionado (ni aquí ni en el duplicado): con las clases Atomic tienes un ingenioso método lazySet. En la mayoría de las arquitecturas supera a la escritura volátil básica (pero no tiene la misma semántica). Básicamente, lazySet no necesita vaciar los búferes de escritura de la CPU, lo cual es bastante bueno ya que pueden enjuagarse mientras la CPU está detenida. – bestsss