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.