Saltar al contenido

Diferencia de rendimiento de AtomicInteger vs Integer

Solución:

La elección de estos dos tipos no debería depender del rendimiento. La principal elección para AtomicInteger es si desea lograr la seguridad de subprocesos con las operaciones en el entero.

Sin embargo, la diferencia de rendimiento puede depender en gran medida del sistema operativo elegido, ya que la implementación detallada de las operaciones atómicas depende del sistema operativo.

AtomicInteger permite que algunas (¡no todas!) operaciones que de otro modo requerirían sincronización se realicen sin bloqueo utilizando instrucciones especiales de hardware. La forma en que esto afecta el rendimiento es algo compleja:

  • En primer lugar, es una microoptimización que solo importará si esta operación en particular se encuentra en la ruta crítica de su aplicación.
  • Es posible que las instrucciones especiales de hardware no estén disponibles en plataformas no convencionales, en cuyo caso AtomicInteger probablemente se implementará mediante sincronización.
  • La JVM a menudo puede optimizar la sobrecarga de bloqueo cuando no hay contención (por ejemplo, una aplicación de un solo subproceso). En ese caso, probablemente no haya diferencia.
  • Si hay una contención de bloqueo de baja a moderada (es decir, varios subprocesos, pero en su mayoría hacen otras cosas además de acceder a ese número entero), el algoritmo sin bloqueo funciona mejor que la sincronización.
  • Si hay una contención de bloqueo muy fuerte (es decir, muchos subprocesos que pasan mucho tiempo tratando de acceder a ese número entero), la sincronización puede funcionar mejor porque el algoritmo sin bloqueo se basa en reintentar constantemente la operación cuando falla debido a una colisión.

Bueno, si lo usa en un entorno multiproceso, como, por ejemplo, un contador, entonces debe synchronize acceso al entero

public final class Counter {
  private long value = 0;
  public synchronized long getValue() {
    return value;
  }

  public synchronized long increment() {
    return ++value;
  }
}

Si bien puede tener un rendimiento mucho mejor con AtomicInteger sin sincronización

public class NonblockingCounter {
    private AtomicInteger value;

    public int getValue() {
        return value.get();
    }

    public int increment() {
        return value.incrementAndGet();
    }
}

Lectura recomendada http://cephas.net/blog/2006/09/06/atomicinteger/

EDITAR use incrementAndGet

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *