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
}
Desde incrementAndGet()
es una operación atómica, a lo sumo un hilo recibirá 1
por 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ó 1
se ejecutará en el if
bloque. 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 int
no lo cambia de valor cuando el estado interior de count
cambios. 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);
}