© Swill Klitch/Shutterstock.com
Upgraden von ReadWriteLock

Lock & Crete


Die Java-Klasse ReentrantReadWriteLock kann einen Read Lock nicht auf einen Write Lock upgraden. Kotlins Erweiterungsfunktion ReentrantReadWriteLock.write() schummelt ein wenig, indem sie den Read Lock vor dem Upgrade loslässt und so die Tür für Race Conditions öffnet. Eine bessere Lösung ist StampedLock, das über eine Methode verfügt, mit der versucht wird, den Lock in einen Write Lock umzuwandeln.

In Java 5 kam das ReadWriteLock-Interface mit einer Implementierung von ReentrantReadWriteLock. Sie hatte die sinnvolle Einschränkung, dass wir einen Write Lock zu einem Read Lock herabstufen, jedoch keinen Read Lock auf einen Write Lock upgraden konnten. Wenn wir es versuchten, bekamen wir sofort einen Deadlock. Der Grund für diese Einschränkung: Wenn zwei Threads einen Read Lock hätten, was würde geschehen, wenn beide gleichzeitig versuchten, ein Upgrade durchzuführen? Nur einer könnte erfolgreich sein – aber was ist mit dem anderen Thread? Um sicherzugehen, wird jeder Thread, der ein Upgrade versucht, konsequent blockiert.

Das Herabstufen der ReentrantReadWriteLock funktioniert gut, und wir können in diesem Fall gleichzeitig einen Read Lock und einen Write Lock halten. Eine Herabstufung bedeutet, dass wir, während wir einen Write Lock halten, auch den Read Lock sperren und dann den Write Lock freigeben. Das bedeutet, dass wir anderen Threads das Lesen, aber nicht das Schreiben gestatten (Listing 1).

Listing 1

import java.util.concurrent.locks.*; // This runs through fine public class DowngradeDemo { public static void main(String... args) { var rwlock = new ReentrantReadWriteLock(); System.out.println(rwlock); // w=0, r=0 rwlock.writeLock().lock(); System.out.println(rwlock); // w=1, r=0 rwlock.readLock().lock(); System.out.println(rwlock); // w=1, r=1 rwlock.writeLock().unlock();  // at this point other threads can also acquire read locks System.out.println(rwlock); // w=0, r=1 rwlock.readLock().unlock(); System.out.println(rwlock); // w=0, r=0 } }

Der Versuch, einen ReentrantReadWriteLock von Lesen auf Schreiben zu aktualisieren, führt zu einem Deadlock (Listing 2).

Listing 2

// This deadlocks public class UpgradeDemo { public static void main(String... args) { var rwlock = new ReentrantReadWriteLock(); System.out.println(rwlock); // w=0, r=0 rwlock.readLock().lock(); System.out.println(rwlock); // w=0, r=1 rwlock.writeLock().lock(); // deadlock System.out.println(rwlock); rwlock.readLock().unlock(); System.out.println(rwlock); rwlock.writeLock().unlock(); System.out.println(rwlock); } }

ReadWriteLock in Kotlin

Eines der Dinge, die ich im Corona-Lockdown geschafft habe, ist Kotlin zu lernen. Von allen Quellen, die ich mir angeschaut habe, hat mir das Buch „Kotlin in Action“ [1] am besten gefallen. Sehr empfehlenswert, besonders für Java-Programmierer.

Nachdem ich Kotlin nun ein paar Monate lang studiert habe, bin ich der Meinung, dass es sich positiv auf die Entwicklungsdauer einer App auswirkt, da es jede Menge Zeitersparnis mit sich bringt. Ich kann verstehen, warum die Sprache so viele Fans hat. In den letzten zwei Jahrzehnten habe ich mir neben Java viele andere Sprachen angesehen, von Ruby über Clojure und Scala bis hin zu Swift. Kotlin war jedoch bisher der Gewinner meiner „Zweitsprachen“. Ich kann mir sogar vorstellen, einen Teil meiner JavaSpecialists-Website [2] mit Kotlin neu zu schreiben, nur so zum Spaß.

Eine scheinbar themenfremde Bemerkung: Meiner Meinung nach lesen wir ein Buch nur dann wirklich, wenn wir Fehler entdecken. Daher ist das höchste Kompliment, das ich einem Autor machen kann, ihm eine lange Liste von Fehlern zu schicken. Gut, einige Verlage schludern bei der Schlussredaktion ziemlich heftig, und jede Seite ist mit Fehlern übersät. Aber von diesen spreche ich hier nicht, sondern vielmehr von ausgezeichneten Büchern wie „Effective Java“ [3], „Mastering Lambdas“ [4], „Head First Design Patterns“ [5].

Analog dazu weiß ich, dass ich eine neue Computersprache richtig lerne, wenn ich anfange, Fehler in der eigentlichen Sprache oder im API zu entdecken. Genau darum geht es in meinem „The Java Specialists’ Newsletter“: Seit zwanzig Jahren mache ich mich über all die seltsamen Anomalien in der Programmiersprache Java lustig. Mit Kotlin ist es jedoch schwieriger. Wenn ich auf einen Fehler in einem Buch hinweise, bedanken sich die Autoren normalerweise bei mir, geben zu, dass sie einen Fehler gemacht haben und versuchen, ihn in einer zukünftigen Version zu beheben. Bei Kotlin finde ich es vie...

Neugierig geworden? Wir haben diese Angebote für dich:

Angebote für Gewinner-Teams

Wir bieten Lizenz-Lösungen für Teams jeder Größe: Finden Sie heraus, welche Lösung am besten zu Ihnen passt.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang