Während ich ein Forschungspapier über Parallelität namens Software und die Parallelitätsrevolution ( HTML- Version) las . Ich bin auf folgende Zeilen gestoßen:
Obwohl Sperren funktionieren, stellen sie leider ernsthafte Probleme für die moderne Softwareentwicklung dar. Ein grundlegendes Problem bei Schlössern besteht darin, dass sie nicht zusammensetzbar sind . Sie können nicht zwei korrekte, auf Sperren basierende Codeteile nehmen, sie kombinieren und wissen, dass das Ergebnis immer noch korrekt ist. Die moderne Softwareentwicklung basiert auf der Fähigkeit, Bibliotheken zu größeren Programmen zusammenzusetzen. Daher ist es eine ernsthafte Schwierigkeit, dass wir nicht auf sperrbasierten Komponenten aufbauen können, ohne deren Implementierungen zu untersuchen.
Ich habe darüber nachgedacht, wie Java eine komponierbare Parallelität garantiert oder ob es sogar eine Möglichkeit gibt, diese Szenarien zu erstellen.
Und wie können wir Daten in einer oder mehreren Bibliotheken synchronisieren? Kann ein Programmierer dies von seinem Programm aus tun oder liegt es an der Bibliothek, die Dinge zu synchronisieren?
Wenn nicht Java, gibt es dann eine andere Sprache, die sperrenbasierte Parallelität verwendet und eine zusammensetzbare Parallelität garantiert?
Folgendes stammt ebenfalls aus demselben Papier:
Es gibt mindestens drei Hauptprobleme bei synchronisierten Methoden. Erstens sind sie nicht für Typen geeignet, deren Methoden virtuelle Funktionen für andere Objekte aufrufen (z. B. Java's Vector und .NET's SyncHashTable), da das Aufrufen von Code von Drittanbietern bei gehaltener Sperre die Möglichkeit eines Deadlocks eröffnet . Zweitens können synchronisierte Methoden zu viele Sperren durchführen, indem Sperren für alle Objektinstanzen erfasst und freigegeben werden, auch für diejenigen, die niemals über Threads hinweg geteilt werden (normalerweise die Mehrheit). Drittens können synchronisierte Methoden auch zu wenig Sperren durchführen, indem die Atomizität nicht erhalten bleibt, wenn ein Programm mehrere Methoden für ein Objekt oder für verschiedene Objekte aufruft. Betrachten Sie als einfaches Beispiel für Letzteres eine Überweisung: account1.Credit (Betrag); account2.Debit (Betrag) ...
Hinweis: Das Papier wurde im September 2005 veröffentlicht