Nouveau dans Guava 21 common.util.concurrent

Nouveau dans Guava 21 common.util.concurrent

1. introduction

Dans lesprevious article, nous avons commencé à explorer les nouvelles fonctionnalités introduites dans le packagecommon.collect.

Dans cet article rapide, passons en revue les ajouts au packagecommon.util.concurrent.

2. AtomicLongMap

Dans les scénarios simultanés, lesHashMap standard peuvent ne pas fonctionner correctement, car ils ne sont tout simplement pas simultanés. Dans ce scénario particulier,AtomicLongMap vous renonce en stockant les valeurs deLong de manière thread-safe.

AtomicLongMap a été introduit il y a longtemps dans Guava 11. Maintenant, quatre nouvelles méthodes ont été ajoutées.

2.1. accumulateAndGet ()

La méthodeaccumulateAndGet() met à jour la valeur liée à la clé en la fusionnant avec la valeur existante à l'aide de la fonction d'accumulation. Ensuite, il retourne la valeur mise à jour:

@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 ()

Cette méthode a la fonctionnalité similaire à celle définie ci-dessus, mais elle renvoie l'ancienne valeur au lieu de la valeur mise à jour (comme le suggère l'ordre des opérations dans la même).

2.3. updateAndGet ()

La méthodeupdateAndGet() met à jour la valeur actuelle de la clé à l'aide de la fonction spécifiée fournie comme deuxième paramètre. Ensuite, il retourne la valeur mise à jour de la clé:

@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 ()

Cette méthode fonctionne très similaire àupdateAndGet(), mais elle retourne l'ancienne valeur de la clé plutôt que celle mise à jour.

3. Moniteur

La classe de moniteur est considérée comme le remplacement deReentrantLock aussi elle est un peu plus lisible et moins sujette aux erreurs.

3.1. Monitor.newGuard()

Guava 21, a ajouté une nouvelle méthode -newGuard() - qui renvoie une instanceMonitor.Guard, sert de condition booléenne pour laquelle un thread peut attendre:

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. En savoir plus

Il n'y a aucun ajout dans cette classe, mais l'APIsameThreadExecutor() a été supprimée. Cette méthode est obsolète depuis la v18.0 et il est conseillé d’utiliser à la placedirectExecutor() ounewDirectExecutorService().

5. RenvoiBlockingDeque

ForwardingBlockingDeque est une classe existante qui a été déplacée decommon.collect carBlockingQueue est davantage un type de collection simultanée qu'une collection standard.

6. Conclusion

Guava 21 n'essaie pas seulement d'introduire de nouveaux utilitaires pour suivre Java 8, mais améliore également le modèle existant pour le rendre plus significatif.

Et comme toujours, les exemples de code de cet article sont disponibles dans lesGitHub repository.