Concurrencia de Java - Clase AtomicLong

Una clase java.util.concurrent.atomic.AtomicLong proporciona operaciones sobre un valor largo subyacente que se puede leer y escribir de forma atómica, y también contiene operaciones atómicas avanzadas. AtomicLong admite operaciones atómicas en una variable larga subyacente. Tiene métodos get y set que funcionan como lectura y escritura en variables volátiles. Es decir, un conjunto tiene una relación de suceder antes con cualquier obtención posterior de la misma variable. El método atomic compareAndSet también tiene estas características de coherencia de memoria.

Métodos AtomicLong

A continuación se muestra la lista de métodos importantes disponibles en la clase AtomicLong.

No Señor. Método y descripción
1

public long addAndGet(long delta)

Agrega atómicamente el valor dado al valor actual.

2

public boolean compareAndSet(long expect, long update)

Atómicamente establece el valor en el valor actualizado dado si el valor actual es el mismo que el valor esperado.

3

public long decrementAndGet()

Disminuye atómicamente en uno el valor actual.

4

public double doubleValue()

Devuelve el valor del número especificado como doble.

5

public float floatValue()

Devuelve el valor del número especificado como flotante.

6

public long get()

Obtiene el valor actual.

7

public long getAndAdd(long delta)

Atómicamente agrega el valor dado al valor actual.

8

public long getAndDecrement()

Disminuye atómicamente en uno el valor actual.

9

public long getAndIncrement()

Incrementa atómicamente en uno el valor actual.

10

public long getAndSet(long newValue)

Atómicamente se establece en el valor dado y devuelve el valor anterior.

11

public long incrementAndGet()

Incrementa atómicamente en uno el valor actual.

12

public int intValue()

Devuelve el valor del número especificado como int.

13

public void lazySet(long newValue)

Eventualmente se establece en el valor dado.

14

public long longValue()

Devuelve el valor del número especificado como long.

15

public void set(long newValue)

Establece el valor dado.

dieciséis

public String toString()

Devuelve la representación de cadena del valor actual.

17

public boolean weakCompareAndSet(long expect, long update)

Atómicamente establece el valor en el valor actualizado dado si el valor actual es el mismo que el valor esperado.

Ejemplo

El siguiente programa TestThread muestra una implementación segura de contador usando AtomicLong en un entorno basado en subprocesos.

import java.util.concurrent.atomic.AtomicLong;

public class TestThread {

   static class Counter {
      private AtomicLong c = new AtomicLong(0);

      public void increment() {
         c.getAndIncrement();
      }

      public long value() {
         return c.get();
      }
   }

   public static void main(final String[] arguments) throws InterruptedException {
      final Counter counter = new Counter();
      
      //1000 threads
      for(int i = 0; i < 1000 ; i++) {
         
         new Thread(new Runnable() {
            
            public void run() {
               counter.increment();
            }
         }).start();	
      }
      Thread.sleep(6000);			   		  
      System.out.println("Final number (should be 1000): " + counter.value());
   }
}

Esto producirá el siguiente resultado.

Salida

Final number (should be 1000): 1000