Gibt es ein einzelnes Szenario (mit Ausnahme der Kompatibilität mit alten JVMs), in dem die Verwendung einer synchronized
vorzuziehen ist Lock
? Kann jemand die Verwendung wait
oder notify
über die neueren Systeme rechtfertigen ?
Gibt es einen Algorithmus, muss einer von ihnen bei der Umsetzung nutzen?
Ich sehe eine frühere Frage, die diese Angelegenheit berührt hat, aber ich möchte dies etwas weiter ausführen und sie tatsächlich deprecate
. Es gibt viel zu viele Fallen und Fallstricke und Vorbehalte, die mit den neuen Einrichtungen ausgeräumt wurden. Ich habe nur das Gefühl, es könnte bald Zeit sein, sie als veraltet zu markieren.
java
synchronization
deprecation
OldCurmudgeon
quelle
quelle
Antworten:
Mit ziemlicher Sicherheit nicht. ( In der Tat, aus der theoretischen Perspektive, sollten Sie simulieren warten können / notify anderen java.util.concurrent verwenden. . Klassen. Und synchronisiert konnten mit expliziten Sperroperationen ersetzt werden ... obwohl man vorsichtig entriegeln sein müßte in
finally
Klauseln.)Es gibt jedoch wahrscheinlich Algorithmen, bei denen die leistungsstärkste Implementierung in Java die direkte Verwendung von synchronisiert mit oder ohne Warten und Benachrichtigen umfasst.
Unabhängig von der Antwort auf die vorherige Frage lautet die Antwort definitiv nein.
Das Warten / Benachrichtigen kann (und wird oft) korrekt verwendet. In Java ist die Nichtbeachtung für defekte Klassen und Methoden reserviert. dh wo eine fortgesetzte Verwendung dringend korrigiert werden sollte. Wenn Sun (und jetzt Oracle) etwas so Grundlegendes und weit verbreitetes wie wait / notify ablehnen würde, würde dies ein ernstes Kompatibilitätsproblem für große Mengen an altem Code schaffen. Das ist NICHT im Interesse von irgendjemandem.
Wenn Sie synchronized / wait / notify in Ihrem Code loswerden möchten, ist das in Ordnung. Aber Verfall erfordert das Umschreiben großer Mengen von im Wesentlichen korrektem Multithread-Code, und das wäre eine SCHLECHTE IDEE. IT-Manager und Software-Produktmanager in Unternehmen hassen es, wenn Sie dies vorschlagen ...
Es lohnt sich zu lesen , was „veraltet“ Mittel entsprechend der Java - Dokumentation: http://docs.oracle.com/javase/1.5.0/docs/guide/javadoc/deprecation/deprecation.html
Beachten Sie auch, dass wir über das Abwerten von Dingen sprechen, die für die Java-Sprache von zentraler Bedeutung sind. Abwertung
synchronized
hat enorme Konsequenzen.quelle
java.util.concurrent
util-Klassen laut dem hervorragenden Buch „Java Concurrency in Practice“ tatsächlich schneller. Hinter den Kulissen sprechen diese Klassen direkt mit der VM, bei der synchronisiert eine stumpfe Sperre für das Objekt im Objektdiagramm installiert wird und sich somit auf die globale Leistung auswirkt.synchronized
et tatsächlich entfernen . al. Ich schlage nur vor, nicht mehr weiterzuentwickeln, was eigentlich nur besagt, dass dies nicht für neuen Code verwendet wird. Ich hätte nicht gedacht, dass erprobter Legacy-Code beschädigt werden könnte, wenn ich dessen Entfernung fordere.