Ist es an der Zeit, synchronisiert abzulehnen, zu warten und zu benachrichtigen?

13

Gibt es ein einzelnes Szenario (mit Ausnahme der Kompatibilität mit alten JVMs), in dem die Verwendung einer synchronizedvorzuziehen ist Lock? Kann jemand die Verwendung waitoder 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.

OldCurmudgeon
quelle
4
Haben Sie Brian Goetz 'Java Concurrency in Practice gelesen? Er deckt die implizite und die explizite Sperrdebatte gut ab.
Martijn Verburg
@MartijnVerburg - Leider nein, aber ich habe großen Respekt für seine Arbeit.
OldCurmudgeon
1
synchronisiertes Schlüsselwort kann mit einfachen statischen Methoden nützlich sein, die thread-sicher sein sollten, für alles andere würde ich gleichzeitig verwenden. Aber das ist meine Meinung
Kemoda

Antworten:

11

Gibt es einen Algorithmus, der einen davon in seiner Implementierung verwenden muss?

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 finallyKlauseln.)

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.


Ist es an der Zeit, synchronisiert abzulehnen, zu warten und zu benachrichtigen?

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 synchronizedhat enorme Konsequenzen.

Stephen C
quelle
Soweit ich mich erinnere, sind die java.util.concurrentutil-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.
Akuhn
Verzeihen Sie mir @Stephen, wenn ich den Eindruck habe, dass wir synchronizedet 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.
OldCurmudgeon
@OldCurmudgeon - eher eine späte Antwort, aber ich denke, die Abwertung ist zu extrem. 1) Es bedeutet , dass die Funktion kann entfernt werden. 2) Dies impliziert, dass das Merkmal beschädigt ist und nicht nur altmodisch ist. 3) Viele Leute schreiben immer noch gerne neuen Code auf diese Weise ... und es gibt keinen triftigen Grund, warum sie das nicht tun sollten. 4) Es gibt andere, weniger "in Ihrem Gesicht" Möglichkeiten, es zu entmutigen; zB PMD-Regeln schreiben ...
Stephen C
@StephenC - Gibt es dann eine etwas weniger dramatische Aktion, die dazu führen kann, dass sie im College nicht benutzt oder unterrichtet werden? Sie sollten eindeutig vermieden werden. Ich vermute, dass PMD-Regeln - obwohl eine gute Idee - die Lehrer nicht sehr schnell erreichen würden.
OldCurmudgeon
1
@StephenC Ein Trottel: Wenn man sich die Java-Dokumente ansieht, mit denen man verlinkt ist, bedeutet das nicht, dass der veraltete Code kaputt ist. Dies ist ein Grund, aber wie in den Dokumenten angegeben, kann eine API veraltet sein, wenn sie durch eine neuere, bessere API ersetzt wird (wie das OP argumentiert, ist dies bei gleichzeitiger Verwendung der Fall). Und eine Nebenläufigkeit auf niedriger Ebene ist sicherlich sehr fehleranfällig , wenngleich sie nicht zu schlechten Praktiken ermutigt .
Andres F.