tipos sincronizados productor modificador metodos evitar ejemplos consumidor concurrencia java

sincronizados - tipos de variables en java ejemplos



¿Puede AtomicInteger reemplazar sincronizado? (5)

¿Se necesita volatile cuando uso AtomicInteger?

No necesariamente. Teniendo en cuenta tu ejemplo:

  • si i es una variable local, o
  • si i es un atributo final , o
  • si el hilo actual y el hilo que se inicializaron (o se actualizaron por última vez) la variable i han sincronizado después de ese evento,

entonces no hace ninguna diferencia si declara i como volátil o no.

El javadoc para el paquete java.util.concurrent.atomic dice lo siguiente:

Un pequeño conjunto de herramientas de clases que admiten la programación segura de subprocesos sin bloqueo en variables individuales.

Pero no veo ningún código seguro para subprocesos (sincronizado o de bloqueo) dentro de ninguna de las clases AtomicInteger o AtomicBoolean.

Entonces, ¿son estos 2 los mismos?

1.

int i; synchronized(this){i++;}

2.

AtomicInteger i = new AtomicInteger(); i.getAndIncrement();

Actualización : Gracias por las respuestas. ¿Se necesita volatile cuando uso AtomicInteger?


AtomicInteger usa sun.misc.Unsafe debajo para realizar las actualizaciones atómicas.

Entonces, en respuesta a su pregunta, sí, AtomicInteger es seguro para subprocesos .


Ofrecerían la misma atomicidad. Lo único que debe tener en cuenta es que, cada vez que lea, debe envolverlo con sincronización también.

synchronized(this){ return i;}

Editar para responder a su edición:

El volátil no es necesario para su AtomicInteger. Para probar que declaran el AtomicInteger final. La única razón por la que necesitaría que AtomicInteger sea volátil es si el campo AtomicInteger cambia. Similar a:

volatile AtomicInteger i = new AtomicInteger(0); public void work(){ i.incrementAndGet(); //...do some other stuff i = new AtomicInteger(10);//because the field i is changing the field needs to be volatile }

Como puedes imaginar, ese no debería ser el caso, por lo que no debes preocuparte si el campo es volátil.


Sí, son funcionalmente equivalentes.

Si se encuentra en un entorno de contención ultraalta, puede ver diferencias de rendimiento, pero eso es muy poco probable.


Son equivalentes funcionalmente, pero hay una diferencia sutil. synchronized tiene la sobrecarga de adquirir y liberar el monitor, mientras que AtomicInteger se implementa con una llamada de método nativo, por lo que será significativamente más rápido.