He visto las otras preguntas volátiles vs. Atomicxxxx en SO (incluyendo this one) y he leído the description of java.util.current.atomic, y no estoy del todo satisfecho con los matices.¿Cuándo es preferible usar booleano volátil en Java en lugar de AtomicBoolean?
Si estoy tratando de decidir entre usar volatile boolean
y AtomicBoolean
, ¿existen diferencias prácticas además de las operaciones atómicas de lectura, escritura y modificación que ofrece AtomicBoolean? (Por ejemplo compareAndSet()
y getAndSet()
)
Supongamos que tengo
volatile boolean flag;
Entonces uno o más hilos fijan la bandera (pero no está claro él). Si tengo un hilo que lee el indicador, y si se establece, realiza una acción, y luego borra el indicador, ¿es adecuado el volatile
?
¿Hay un costo mayor a AtomicBoolean de booleano volátil, en términos de
- espacio de memoria
- impacto en el rendimiento (
volatile boolean
parece requerir la esgrima memoria,AtomicBoolean
parece requerir cercas de memoria + algunos menores de bloqueo en Operaciones CAS según la descripción java.util.current.atomic)
Mi intuición es simplemente ir con AtomicBoolean y estar a salvo, pero quiero entender si alguna vez hay una situación para usar volatile boolean
en su lugar (p. si tuviera miles de instancias de ellos y el rendimiento fuera un problema).
¿Qué estás tratando de hacer con esta bandera? ¿Estás usando la bandera para controlar la concurrencia o alguna otra cosa? Me pregunto si el problema subyacente ayudaría a explicar qué respuesta estás buscando. –
'Si tengo un hilo que lee el indicador, y si se establece, realiza una acción, y luego borra el indicador, ¿es adecuado volátil?' Sí, eso es exactamente lo que se supone que la palabra clave 'volátil' debe resolver por usted. –
@Jonathan: era solo un ejemplo en particular ... Estaba pensando en un programa donde tengo componentes marcados como "sucios" que necesitan persistencia. Los componentes se marcan como "sucios" y un administrador de persistencia encuentra los componentes sucios, guarda su estado y los marca como no sucios. –