Novo no Guava 21 common.util.concurrent

Novo no Guava 21 common.util.concurrent

1. Introdução

Emprevious article, começamos a explorar a nova funcionalidade introduzida no pacotecommon.collect.

Neste artigo rápido, vamos percorrer as adições ao pacotecommon.util.concurrent.

2. AtomicLongMap

Em cenários simultâneos, oHashMap padrão pode não funcionar bem, pois simplesmente não é simultâneo. Nesse cenário específico,AtomicLongMap ajuda você ao armazenar valores deLong de maneira thread-safe.

AtomicLongMap foi introduzido há muito tempo no Guava 11. Agora, quatro novos métodos foram adicionados.

2.1. acumulateAndGet ()

O métodoaccumulateAndGet() atualiza o valor vinculado à chave mesclando-o com o valor existente usando a função de acumulador. Em seguida, ele retorna o valor atualizado:

@Test
public void accumulateAndGet_withLongBinaryOperator_thenSuccessful() {
    long noOfStudents = 56;
    long oldValue = courses.get(SPRING_COURSE_KEY);

    long totalNotesRequired = courses.accumulateAndGet(
      "Guava",
      noOfStudents,
      (x, y) -> (x * y));

    assertEquals(totalNotesRequired, oldValue * noOfStudents);
}

2.2. getAndAccumulate ()

Este método tem a funcionalidade semelhante à definida acima, mas retorna o valor antigo em vez do valor atualizado (como sugere a ordem das operações na mesma).

2.3. updateAndGet ()

O métodoupdateAndGet() atualiza o valor atual da chave usando a função especificada fornecida como o segundo parâmetro. Em seguida, ele retorna o valor atualizado da chave:

@Test
public void updateAndGet_withLongUnaryOperator_thenSuccessful() {
    long beforeUpdate = courses.get(SPRING_COURSE_KEY);
    long onUpdate = courses.updateAndGet(
      "Guava",
      (x) -> (x / 2));
    long afterUpdate = courses.get(SPRING_COURSE_KEY);

    assertEquals(onUpdate, afterUpdate);
    assertEquals(afterUpdate, beforeUpdate / 2);
}

2.4. getAndUpdate ()

Este método funciona de maneira muito semelhante aupdateAndGet(), mas retorna o valor antigo da chave em vez de um valor atualizado.

3. Monitor

A classe do monitor é considerada como a substituição deReentrantLock também é um pouco mais legível e menos sujeita a erros.

3.1. Monitor.newGuard()

Guava 21, adicionado um novo método -newGuard() - que retorna uma instânciaMonitor.Guard, serve como uma condição booleana pela qual um thread pode esperar:

public class MonitorExample {
    private List students = new ArrayList();
    private static final int MAX_SIZE = 100;

    private Monitor monitor = new Monitor();

    public void addToCourse(String item) throws InterruptedException {
        Monitor.Guard studentsBelowCapacity = monitor.newGuard(this::isStudentsCapacityUptoLimit);
        monitor.enterWhen(studentsBelowCapacity);
        try {
            students.add(item);
        } finally {
            monitor.leave();
        }
    }

    public Boolean isStudentsCapacityUptoLimit() {
        return students.size() > MAX_SIZE;
    }
}

4. MoreExecutors

Não há acréscimos nesta classe, mas a APIsameThreadExecutor() foi removida. Este método foi descontinuado desde a v18.0 e é aconselhável usardirectExecutor() ounewDirectExecutorService().

5. ForwardingBlockingDeque

ForwardingBlockingDeque é uma classe existente que foi movida decommon.collect porqueBlockingQueue é mais um tipo de coleção simultânea do que uma coleção padrão.

6. Conclusão

O Guava 21 não está apenas tentando introduzir novos utilitários para acompanhar o Java 8, mas também melhorando o modelo existente para ter mais significado.

E, como sempre, os exemplos de código neste artigo estão disponíveis emGitHub repository.