La respuesta depende de la arquitectura. En un x86, no hay gastos adicionales asociados con lecturas volátiles específicamente, aunque existen implicaciones para otras optimizaciones.
JMM cookbook from Doug Lea, see architecture table near the bottom.
Para aclarar: No hay ninguna sobrecarga adicional asociada con el propio leer. Las barreras de memoria se utilizan para garantizar el orden correcto. JSR-133 clasifica cuatro barreras "LoadLoad, LoadStore, StoreLoad y StoreStore". Dependiendo de la arquitectura, algunas de estas barreras corresponden a un "no-op", lo que significa que no se toman medidas, otras requieren una valla. No hay un costo implícito asociado con la carga en sí, aunque se puede incurrir en uno si hay una valla en su lugar. En el caso del x86, solo una barrera StoreLoad da como resultado una cerca.
Como se señala en una publicación de blog, el hecho de que la variable sea volátil significa que hay suposiciones sobre la naturaleza de la variable que ya no se pueden realizar y algunas optimizaciones del compilador no se aplicarán a un elemento volátil.
Volátil no es algo que deba usarse con ligereza, pero tampoco debe temerse. Hay muchos casos en los que bastará un volátil en lugar de un bloqueo más fuerte.
¿Podría agregar "java" en algún lugar de la pregunta? Ha habido confusiones con C: simplemente establecer la palabra clave no parece ser suficiente. –
parece estar allí ahora – pdeva