AtomicInteger operaciones y compara

V1666:

Estoy tratando de utilizar una variable como AtomicInteger bloqueo. Por lo tanto, se pregunta si el código publica a continuación es seguro hilo. Sé incrementAndGet () es una operación atómica. Sin embargo, no estoy seguro de si el '==' operación posterior será atómica, así (¿y si el valor se incrementa a 2, en el momento en que hago la comparación.). Lo que la publicación esta pregunta escuchar sus pensamientos.

private AtomicInteger count = new AtomicInteger(0); //Shared variable
private final int max = 1;

if(count.incrementAndGet() == max) {
  //Do something
}
Steffen:

Desde incrementAndGet()es una operación atómica, a lo sumo un hilo recibirá 1por resultado (siempre que el AtomicInteger no está ajustado a un valor inferior a 1). Esto está garantizado por AtomicInteger. Aunque la comparación real es no parte de esta operación atómica, sólo el hilo que recibió 1se ejecutará en el ifbloque. Esto se debe a la comparación compara dos valores de tipo int: El resultado de incrementAndGet()) y max. El AtomicInteger no juega un papel en él ya que el primitivo intno lo cambia de valor cuando el estado interior de countcambios. tl; dr: Su código es equivalente a:

final int val = count.incrementAndGet(); // (it makes no difference if val is not 'final`)
if (val == max) {
    // ...
}

Java proporciona muchas otras maneras de lograr hilo de seguridad ( bloqueo , CountDownLatch , Semáforo , ...), pero ya se está refiriendo a un AtomicInteger, creo AtomicInteger.compareAndSet () es más preciso a lo que pedían:

if (count.compareAndSet(0, 1)) {
    // executed if count == 0
    count.set(0);
}

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=212823&siteId=1
Recomendado
Clasificación