Neu in Guava 21 common.util.concurrent

Neu in Guava 21 common.util.concurrent

1. Einführung

Inprevious article haben wir begonnen, die neue Funktionalität zu untersuchen, die im Paketcommon.collect eingeführt wurde.

In diesem kurzen Artikel gehen wir die Ergänzungen zumcommon.util.concurrent-Paket durch.

2. AtomicLongMap

In gleichzeitigen Szenarien funktionieren StandardHashMapmöglicherweise nicht wirklich gut, da sie einfach nicht gleichzeitig ausgeführt werden. In diesem speziellen Szenario werden Sie vonAtomicLongMap gerettet, indem die Werte vonLongthreadsicher gespeichert werden.

AtomicLongMap wurde vor langer Zeit in Guava 11 eingeführt. Nun wurden vier neue Methoden hinzugefügt.

2.1. accumulateAndGet ()

Die Methode vonaccumulateAndGet()aktualisiert den mit dem Schlüssel verknüpften Wert, indem sie ihn mithilfe der Akkumulatorfunktion mit dem vorhandenen Wert zusammenführt. Dann wird der aktualisierte Wert zurückgegeben:

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

Diese Methode hat die gleiche Funktionalität wie oben definiert, gibt jedoch den alten Wert anstelle des aktualisierten Werts zurück (wie in der Reihenfolge der Vorgänge in derselben Tabelle angegeben).

2.3. updateAndGet ()

Die MethodeupdateAndGet()aktualisiert den aktuellen Wert des Schlüssels unter Verwendung der angegebenen Funktion, die als zweiter Parameter bereitgestellt wird. Dann wird der aktualisierte Wert des Schlüssels zurückgegeben:

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

Diese Methode funktioniert sehr ähnlich wieupdateAndGet(), gibt jedoch den alten Wert des Schlüssels zurück und nicht den aktualisierten.

3. Monitor

Die Monitorklasse wird als Ersatz fürReentrantLock angesehen, ist außerdem etwas lesbarer und weniger fehleranfällig.

3.1. Monitor.newGuard()

Guava 21, eine neue Methode hinzugefügt -newGuard() -, die eineMonitor.Guard-Instanz zurückgibt, dient als boolesche Bedingung, auf die ein Thread warten kann:

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

Diese Klasse enthält keine Ergänzungen, aber die API vonsameThreadExecutor()wurde entfernt. Diese Methode ist seit Version 18.0 veraltet und es wird empfohlen, stattdessendirectExecutor() odernewDirectExecutorService() zu verwenden.

5. ForwardingBlockingDeque

ForwardingBlockingDeque ist eine vorhandene Klasse, die voncommon.collect verschoben wurde, daBlockingQueue eher ein gleichzeitiger Sammlungstyp als eine Standardsammlung ist.

6. Fazit

Guava 21 versucht nicht nur, neue Dienstprogramme einzuführen, um mit Java 8 Schritt zu halten, sondern auch, das vorhandene Modell zu verbessern, um es aussagekräftiger zu machen.

Und wie immer sind die Codebeispiele in diesem Artikel inGitHub repository verfügbar.