Simultaneidade Java - classe AtomicLong

Uma classe java.util.concurrent.atomic.AtomicLong fornece operações no valor longo subjacente que podem ser lidos e gravados atomicamente e também contém operações atômicas avançadas. AtomicLong suporta operações atômicas na variável longa subjacente. Ele possui métodos get e set que funcionam como leituras e gravações em variáveis ​​voláteis. Ou seja, um conjunto tem um relacionamento acontece antes com qualquer obtenção subsequente na mesma variável. O método atômico compareAndSet também possui esses recursos de consistência de memória.

Métodos AtomicLong

A seguir está a lista de métodos importantes disponíveis na classe AtomicLong.

Sr. Não. Método e Descrição
1

public long addAndGet(long delta)

Adiciona atomicamente o valor fornecido ao valor atual.

2

public boolean compareAndSet(long expect, long update)

Define atomicamente o valor para o valor atualizado fornecido se o valor atual for igual ao valor esperado.

3

public long decrementAndGet()

Diminui atomicamente em um o valor atual.

4

public double doubleValue()

Retorna o valor do número especificado como um duplo.

5

public float floatValue()

Retorna o valor do número especificado como um float.

6

public long get()

Obtém o valor atual.

7

public long getAndAdd(long delta)

Atomicamente adiciona o valor fornecido ao valor atual.

8

public long getAndDecrement()

Diminui atomicamente em um o valor atual.

9

public long getAndIncrement()

Aumenta atomicamente em um o valor atual.

10

public long getAndSet(long newValue)

Define atomicamente o valor fornecido e retorna o valor antigo.

11

public long incrementAndGet()

Aumenta atomicamente em um o valor atual.

12

public int intValue()

Retorna o valor do número especificado como um inteiro.

13

public void lazySet(long newValue)

Eventualmente define o valor fornecido.

14

public long longValue()

Retorna o valor do número especificado como um longo.

15

public void set(long newValue)

Define o valor fornecido.

16

public String toString()

Retorna a representação de String do valor atual.

17

public boolean weakCompareAndSet(long expect, long update)

Define atomicamente o valor para o valor atualizado fornecido se o valor atual for igual ao valor esperado.

Exemplo

O programa TestThread a seguir mostra uma implementação segura de contador usando AtomicLong em ambiente baseado em thread.

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());
   }
}

Isso produzirá o seguinte resultado.

Resultado

Final number (should be 1000): 1000